有没有一种方法可以禁用visual studio 2010的c++模板类中的成员函数(没有默认的函数模板参数)



例如

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

最新更新