例如
#include "boost/type_traits.hpp"
template <bool enable>
struct Foo {
template <bool e = enable>
typename boost::enable_if_c<e,void>::type DoStuff(){}
};
int main(){
// Compiles
Foo<true>().DoStuff();
// Fails
Foo<false>().DoStuff();
}
将在现代编译器中工作,但不能在visualstudio2010中工作,因为visualstudio2010不允许函数/方法使用默认模板参数。有没有其他方法可以制定与VS2010相同的任务?
您可以像一样专门化整个类
template <bool enable>
struct Foo {};
template <>
struct Foo<true> {
void DoStuff(){}
};
template <>
struct Foo<false> {
};
然后
int main(){
// Compiles
Foo<true>().DoStuff();
// Fails
Foo<false>().DoStuff();
}
您可以通过SFINAE:丢弃DoStuff
template<bool enable>
struct Foo {
private:
static void SFINAE_Helper(std::true_type);
typedef std::integral_constant<bool, enable> tag;
public:
decltype(SFINAE_Helper(tag())) DoStuff() { }
};
除了这个代码很难阅读之外,它还有一个优点,即您不需要进行额外的专业化,但可以将所有代码放在一个类模板中。
编辑
另一种选择可能是这样的:
template<bool enable>
struct Foo {
private:
typedef std::enable_if<enable> enable_tag;
public:
typename enable_tag::type DoStuff() {}
};