模板构造函数的模板类专门化

时间:2016-03-23 08:43:41

标签: c++ templates specialization boost-variant

是否可以为其模板类的特定特化指定模板构造函数 ONLY ? 我有这段代码:

template <typename T>
class A {
public:
    A(std::function<T()> f) : x(f) {}

    template <typename Y>
    A<void>(Y* x) : x(x) {}
private:
    boost::variant<int*, char*, std::function<T()>> x;
}

我试图让第二个构造函数只针对非std :: function参数进行编译,这就是为什么我试图找到一种方法来明确地告诉编译器T应该是无效的情况,但显然这不会编译。

1 个答案:

答案 0 :(得分:0)

您可以使用SFINAE和其他参数以及默认值

template <typename T>
struct is_std_function : public std::false_type {};

template <typename T>
struct is_std_function<std::function<T> > : public std::true_type{};    

template <typename T>
class A {
public:
    A(std::function<T()> f) : x(f) {}

    template <typename Y>
    A(Y* x, typename std::enable_if< !is_std_function<Y>::value >::type * = 0) : x(x) {}
private:
    boost::variant<int*, char*, std::function<T()>> x;
}

现在对于std函数类型,由于第二个参数,你的构造函数不能被专门化。