当前位置: 首页 > 知识库问答 >
问题:

Smarter可用于处理集装箱

唐沈义
2023-03-14

我试图写我自己的版本的d::is_copy_constructible,将返回false的容器只移动类型。

我已经找到了这个答案,描述了如何为特定的容器类型工作。现在我正在尝试扩展它以适用于任何容器。出于我的目的,我将“容器”定义为具有“value_type”成员的任何类。为了确定一个类是否有一个value_type成员,我在这个答案上使用了一个变体。

所以我现在基本上是这样的:

template <typename T, typename = void>
struct has_value_type : std::false_type {};
template <typename T>
struct has_value_type<T, decltype(std::declval<T>().value_type, void())> : std::true_type {};

用于确定类是否具有值\类型成员,以及:

template <template <typename> class test, typename T>
struct smart_test : test<T> {};
template <template <typename> class test, typename T, typename A>
struct smart_test<test, std::vector<T, A>> : smart_test<test, T> {};
template <typename T>
using smart_is_copy_constructible = smart_test<std::is_copy_constructible, T>;

对于定义smart_,它是可构造的,可正确用于向量和非容器类型。

我想将两者结合起来创建一个版本的smart_is_copy_constructible,它可以正确地用于所有容器类型(具有值类型成员的类型)。我怀疑我需要使用std::enable_if和has_value_type struct以某种方式实现这一点,但这是我第一次尝试模板元编程,我不确定如何继续。

到目前为止,我最好的猜测是试试这个

template <template <typename> class test, typename T>
struct smart_test<test, std::enable_if_t<has_value_type<T>::value> : smart_test<test, typename T::value_type> {};

而不是前一个代码块中的第二个声明(该代码块定义了在vector上专用的smart_测试版本),但这无法编译。

任何帮助都将不胜感激!

共有1个答案

饶滨海
2023-03-14

是,std::enable_如果可以:

// I'd recommend following the standard library's naming convention
template<typename T, typename = void>
struct smart_is_copy_constructible : std::is_copy_constructible<T> { };
template<typename T>
struct smart_is_copy_constructible<T, std::enable_if_t<has_value_type<T>::value>> : std::is_copy_constructible<typename T::value_type> { };

template<typename T>
constexpr bool smart_is_copy_constructible_v = smart_is_copy_constructible<T>::value;

戈德博尔特

但是有\u值\u类型大多是多余的。您的实现不起作用,我在评论中给出的实现足够短,可以内联(不过,正如Nicol Bolas所建议的,您可能希望使的值类型更复杂):

template<typename T, typename = void>
struct smart_is_copy_constructible : std::is_copy_constructible<T> { };
template<typename T>
struct smart_is_copy_constructible<T, std::void_t<typename T::value_type>> : std::is_copy_constructible<typename T::value_type> { };

戈德博尔特

(第一个示例中使用的校正后的具有_值_类型

template <typename T, typename = void>
struct has_value_type : std::false_type {};
template <typename T>
struct has_value_type<T, std::void_t<typename T::value_type>> : std::true_type {};

)

 类似资料:
  • 我的EJBTest有问题。 我安装了WildFly并配置了用户管理和应用程序管理。 我编写了一个EJB 3.0并进行了部署: 之后,我编写了一个简单的客户端来连接它: 用户名和密码都是应用程序用户凭据,而不是管理!对吗? 我收到以下错误: 线程“main”java中出现异常。lang.IllegalStateException:EJBClient00025:没有可用于处理调用上下文组织的[appN

  • 问题内容: 我正在尝试使用JAXB解组以下XML: 我已经使用XJC生成了所有类。如果要访问Composers集合,则必须执行以下操作: 有什么办法可以代替我吗? 我理解需要一个从XML派生的Composers对象,但是在使用Java进行交易时,拥有一个用于存储集合的中间POJO似乎有点多余。 我的XSD是: 问题答案: 该 @XmlElementWrapper 插件不正是你想要的。

  • 1.【强制】 关于 hashCode 和 equals 的处理,遵循如下规则: 1) 只要重写equals,就必须重写hashCode。 2) 因为Set存储的是不重复的对象,依据hashCode和equals进行判断,所以Set存储的 对象必须重写这两个方法。 3) 如果自定义对象做为Map的键,那么必须重写hashCode和equals。 说明: String 重写了 hashCode 和 e

  • 例如:对于来自服务器的特定错误代码,我在响应正文中接收一个新的Auth令牌,刷新该令牌,然后克隆。当然,服务器的响应还有其他几个全局行为。 当前解决方案(不含Rx): 我的问题是:在最终链接(或重试)回订阅服务器方法之前,有没有什么方法可以实现这种集中式响应处理行为?

  • 尽管我们已经实现了购物车的基本功能,不过我们还有许多功能需要处理。一开始,我们要识别出用户是何时添加多个相同商品至购物车的。而且,当错误发生时我们也要保证购物车可以友好地反应,以及向客户或系统管理员通知相应信息。 迭代 E1:创建更智慧的购物车 由于我们需要统计购物车中的每件商品数量,所以我们需要修改 line_items 表。不过我们已经使用过迁移了,就像 64 页的情况一样,我们已经应用过迁移

  • null 我的git和Gradle技能是初学者水平。我将非常感谢对这项任务的任何帮助。谢谢你。