Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在构造函数中启用Boost__C++_Boost_Enable If - Fatal编程技术网

C++ 在构造函数中启用Boost_

C++ 在构造函数中启用Boost_,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>

我有一个模板类,我只想在类型为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”,但我不确定这是什么意思

事先非常感谢你

B(int arg1=0, typename boost::enable_if_c<boost::is_same<T, double>::value>=0);
更好的是,不要使用下划线c版本的enable if。仅在以下情况下使用enable:

B(int arg1=0,
  typename boost::enable_if<boost::is_same<T, double>, int>::type arg2=0);

在这种情况下不能使用SFIANE,因为它仅在函数模板参数的替换失败时有效,而在类模板参数的替换失败时无效

你需要的是专业化

但据我所知,您应该在双格中复制公共格的实现,但只添加新的构造函数

在这种情况下,我建议使用一种小的有线技术:您可以从您的专业化中的常见情况派生

然后你会面临两个问题:

您仍然应该有两个专门化的通用案例来派生 您不应该调用普通情况下的默认构造函数,而应该调用一些专门的构造函数。 好了:

template<typename T, bool = false>
class B
{
public:
    B() { std::cout << "B common\n"; }
    void yahoo() { std::cout << "yahoo!\n"; }

protected:
    struct internal_t;
    B(internal_t*){}

};

template <>
struct B<double, false>: public B<double, true>
{
    B(int, int):B<double, true>(0) { std::cout << "B double\n"; }
};

int main(int argc,char *argv[])
{
    B<int> ib;
    B<double> b(2,5);

    ib.yahoo();
    b.yahoo();
}

嗯,你真的不能这么做。如果您提供了一些不是双精度的T,那么编译器将尝试解析enable_If_c::type,这将失败,使整个类实例化失败,而不仅仅是构造函数

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

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

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

似乎缺少::类型。您希望实现什么?您编写的代码是“只有当T是double时,才能实例化B”。但是模板的用途是什么呢?SFIANE在这种情况下不起作用,因为T是类参数,而不是函数1。我有多个构造函数,但我只希望某个构造函数只对B可用。当我放入:Bint arg1=0时,typename boost::enable_if_c::type arg2=0;我得到一个错误:struct boost::enable_if中没有名为type的类型_c@user1504193:那是因为您不能将此用于SFINAE。您可以使用这个概念将类模板限制为仅加倍,但是为什么还要麻烦使用模板呢?在模板方面更有意义的是,仅通过将boost::is_更改为boost::is_浮点,将模板限制为浮点类型。如果我不使用C++11,我可以用boost::替换std::吗?不,因为正如我在回答中提到的,默认函数模板参数是C++11的一个特性。因此,使上述代码工作的唯一方法是使用该功能。我的意思是,你可以使用boost::enable_if,但你仍然需要C++11。我希望我能给你+100。我花了好几个小时想办法让它工作,现在它就在这里。谢谢你为什么在这里使用struct而不是class?@user1504193,实际上,无论你使用struct还是class,这都无关紧要。我使用struct是因为它允许省略public:,因为struct中默认情况下所有成员都是public。
#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);
}