为什么此代码(M类中的fnc值)无法通过SFINAE规则解决?我收到了一个错误:
Error 1 error C2039: 'type' : is not a member of
'std::tr1::enable_if<_Test,_Type>'
当然类型不是成员,它没有在enable_if的这个通用版本中定义,但是如果bool为true则不支持fnc的这个版本并且如果它是假的则不实例化它的背后的全部想法?可以请有人向我解释一下吗?
#include <iostream>
#include <type_traits>
using namespace std;
template <class Ex> struct Null;
template <class Ex> struct Throw;
template <template <class> class Policy> struct IsThrow;
template <> struct IsThrow<Null> {
enum {value = 0};
};
template <> struct IsThrow<Throw> {
enum {value = 1};
};
template <template <class> class Derived>
struct PolicyBase {
enum {value = IsThrow<Derived>::value};
};
template<class Ex>
struct Null : PolicyBase<Null> { };
template<class Ex>
struct Throw : PolicyBase<Throw> { } ;
template<template< class> class SomePolicy>
struct M {
//template<class T>
//struct D : SomePolicy<D<T>>
//{
//};
static const int ist = SomePolicy<int>::value;
typename std::enable_if<ist, void>::type value() const
{
cout << "Enabled";
}
typename std::enable_if<!ist, void>::type value() const
{
cout << "Disabled";
}
};
int main()
{
M<Null> m;
m.value();
}
答案 0 :(得分:5)
SFINAE不适用于非模板功能。相反,你可以例如使用专门化(类)或基于重载的调度:
template<template< class> class SomePolicy>
struct M
{
static const int ist = SomePolicy<int>::value;
void value() const {
inner_value(std::integral_constant<bool,!!ist>());
}
private:
void inner_value(std::true_type) const { cout << "Enabled"; }
void inner_value(std::false_type) const { cout << "Disabled"; }
};
答案 1 :(得分:3)
这里有 no sfinae 。
知道M<Null>
后,变量ist
也是已知的。
那么std::enable_if<ist, void>
也是明确定义的。
你的一个功能没有明确定义。
SFINAE仅适用于模板功能。 模板函数在哪里?
将您的代码更改为
template<int> struct Int2Type {}
void value_help(Int2Type<true> ) const {
cout << "Enabled";
}
void value_help(Int2Type<false> ) const {
cout << "Disabled";
}
void value() const {
return value_help(Int2Type<ist>());
}