c – 在模板参数中通过SFINAE选择构造函数
发布时间:2020-12-16 10:11:48 所属栏目:百科 来源:网络整理
导读:我正在尝试通过SFINAE选择构造函数如下: templatetypename Tclass MyClass{public: templatetypename C,typename = std::enable_if_tstd::is_classC::value MyClass(C) { } templatetypename C,typename = std::enable_if_tstd::is_pointerC::value MyClass
我正在尝试通过SFINAE选择构造函数如下:
template<typename T> class MyClass { public: template<typename C,typename = std::enable_if_t<std::is_class<C>::value>> MyClass(C) { } template<typename C,typename = std::enable_if_t<std::is_pointer<C>::value>> MyClass(C) { } }; 但编译器抱怨以下错误:
甚至没有实例化构造函数. 我制定了一个工作但丑陋的解决方案,由于额外的未使用参数,我不想使用它: template<typename T> class MyWorkingClass { public: template<typename C> MyWorkingClass(C,std::enable_if_t<std::is_class<C>::value>* = nullptr) { } template<typename C> MyWorkingClass(C,std::enable_if_t<std::is_pointer<C>::value>* = nullptr) { } }; 这里给出了一个简短的用法示例: void* ptr = nullptr; MyClass<int> mc1(ptr); std::vector<int> vec; MyClass<int> mc2(vec); // Shall raise an error // MyClass<int> mc2(0); 特征std :: is_pointer和std :: is_class只是一个例子,原始特征更复杂. 有没有办法通过SFINAE选择构造函数而不向构造函数添加另一个参数(可能非常接近第一个appproach)? 解决方法
问题是参数的默认值不是模板方法签名的一部分.所以你有两个模板< class C,class> ctor(c)相同的ctors.
template<class T> struct MyClass { template<class C,std::enable_if_t<std::is_class<C>{}>* =nullptr > MyClass(C) { } template<class C,std::enable_if_t<std::is_pointer<C>{}>* =nullptr > MyClass(C) { } }; 这里我们使用依赖类型的模板值参数.它们从不冲突,因为指针模板参数的类型取决于类型参数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |