c++ - 在构造函数中 boost enable_if

标签 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 );
}

我收到错误:“类型为‘boost::enable_if_c’的参数的默认参数的类型为‘int’”,但我不确定这是什么意思。

非常感谢您。

最佳答案

嗯,你真的不能那样做。如果你提供一些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);
}

关于c++ - 在构造函数中 boost enable_if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12115934/

相关文章:

c++ - auto 是如何推断类型的?

c++ - 在 C/C++ 中获取 Linux 中的磁盘标签

c++ - boost::process 异步 IO 示例不起作用?

c++ - 使用文件初始化静态成员

c++ - 无法编译 boost spirit word_count_lexer 示例

c++ - 为自定义路径类型设置 boost property_tree

c++ - 模板方法 enable_if 特化

c++ 03:由于enable_if,互斥方法

c++ - 使用enable_if在按值传递与按引用传递之间更改函数声明

c++ - 避免默认参数异常