我有一个带有模板参数的类,它应该决定它包含两种数据样式中的哪一种。基于这个参数,我想用两种不同的方法来实现一个成员函数。我尝试使用Boost Enable-If,但没有成功。下面是我最惊讶的代码不能工作的版本:
#include <boost/utility/enable_if.hpp>
enum PadSide { Left, Right };
template <int> struct dummy { dummy(int) {} };
template <PadSide Pad>
struct String
{
typename boost::enable_if_c<Pad == Left, void>::type
getRange(dummy<0> = 0) {}
typename boost::enable_if_c<Pad == Right, void>::type
getRange(dummy<1> = 0) {}
};
int main()
{
String<Left> field;
field.getRange();
}对于这一点,g++ 4.6.0说:
no type named ‘type’ in ‘struct boost::enable_if_c<false, void>’当然,第二个重载应该不起作用,但由于SFINAE,它应该被忽略。如果我删除伪函数参数,g++会这样说:
‘typename boost::enable_if_c<(Pad == Right), void>::type
String<Pad>::getRange()‘
cannot be overloaded with
‘typename boost::enable_if_c<(Pad == Left), void>::type
String<Pad>::getRange()‘这就是我把伪参数放在第一位的原因--遵循the documentation的编译器变通方法部分。
基本上,我想要的是有两个getRange()的实现,并根据Pad类型选择其中之一。我希望Enable-If可以让我在不创建辅助类的情况下完成这项工作(我将在此期间尝试)。
发布于 2011-07-14 23:56:54
由于您无论如何都要制作两个不同版本的getRange(),因此您可以根据PadSide的类型重载struct String成员函数。我知道它不是那么“漂亮”,但最终,它仍然是类似的代码量,并且您不必创建多个类类型。
template<PadSide Pad>
struct String
{
void getRange();
};
template<>
void String<Right>::getRange() { /*....*/ }
template<>
void String<Left>::getRange() { /*....*/ }https://stackoverflow.com/questions/6696033
复制相似问题