加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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) { }
};

但编译器抱怨以下错误:

error C2535: ‘MyClass::MyClass(C)’: member function already defined or declared

甚至没有实例化构造函数.

我制定了一个工作但丑陋的解决方案,由于额外的未使用参数,我不想使用它:

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) { }
};

这里我们使用依赖类型的模板值参数.它们从不冲突,因为指针模板参数的类型取决于类型参数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读