通过SFINAE在模板参数中选择构造函数 [英] Select constructor through SFINAE in template arguments

查看:72
本文介绍了通过SFINAE在模板参数中选择构造函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试通过SFINAE选择一个构造函数,如下所示:

I'm trying to select a constructor through SFINAE as following:

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

但编译器抱怨以下错误:

but the compiler complains with following error:

错误C2535:'MyClass :: MyClass(C)':成员函数已定义或声明

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

甚至不实例化构造函数。

without even instantiating the constructor.

我制定了一个可行但丑陋的解决方案,由于多余的未使用参数,我不想使用它:

I worked out a working but ugly solution which i don't want to use because of the extra unused parameter:

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

下面是一个简短的用法示例:

A short usage example is given here:

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 只是一个例子,原始特征更加复杂。

The traits std::is_pointer and std::is_class are just an example, the original traits are more complicated.

有没有办法可以通过SFINAE选择构造函数而不向构造函数添加其他参数(也许非常接近第一个应用程序)?

推荐答案

<问题是参数的默认值不是模板方法签名的一部分。因此,您有两个 template< C类,class> ctor(c)相同的ctor。

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

这里我们使用依赖类型的模板值参数。它们永远不会发生冲突,因为指针模板参数的类型取决于类型参数。

here we use template value arguments of dependant type. They never conflict, as the type of the pointer template argument is dependant on the type argument.

这篇关于通过SFINAE在模板参数中选择构造函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆