在构造函数中提升enable_if

use*_*193 0 c++ boost enable-if

我有一个模板化的类,我想只在类型为double时启用某个构造函数.这段代码出了什么问题?

template<typename T>
class B: public A<T>
{
public:
    B(int arg1=0, typename boost::enable_if_c<boost::is_same<T, double>::value>=0);
}

int main(int argc,char *argv[])
{
B<double> B( 6, 6 );
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:"类型'boost :: enable_if_c'参数的默认参数类型为'int'",但我不确定这是什么意思.

非常感谢你提前.

mfo*_*ini 7

好吧,你真的不能那样做.如果你提供的T不是double,那么编译器将尝试解析enable_if_c<false>::type,这将失败,使整个类实例化失败,而不仅仅是构造函数.

您可以使用C++ 11的默认函数模板参数来实现相同的功能.

下面的代码使用boost您在代码中使用的C++ 11版本的功能来实现:

#include <type_traits>

template<typename T>
class B {
public:
    // T == double -> this ctor can be used
    template<typename U = T, class = typename std::enable_if<std::is_same<U, double>::value>::type>
    B(int arg1, double arg2) {}

    // Default ctor, available to every class.
    B() {}
};

int main(int argc,char *argv[])
{
    B<double> b_double( 6, 6 );
    B<int> b_int;

    // This line fails
    //B<int> b_fails(6, 6);
}
Run Code Online (Sandbox Code Playgroud)