C++ 在构造函数中启用Boost_
我有一个模板类,我只想在类型为double时启用某个构造函数。这个代码怎么了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>
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);
}