首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SFINAE的问题

SFINAE的问题
EN

Stack Overflow用户
提问于 2010-11-12 20:45:18
回答 2查看 862关注 0票数 5

为什么此代码(类M中的FNC值)不能被SFINAE规则解析?我收到一个错误:

代码语言:javascript
复制
Error   1   error C2039: 'type' : is not a member of
                                   'std::tr1::enable_if<_Test,_Type>'  

当然,类型不是成员,它没有在这个通用版本的enable_if中定义,但这背后的整个想法不是为了在bool为真时启用这个fnc版本,而在为假时不实例化它吗?有人能给我解释一下吗?

代码语言:javascript
复制
#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();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-12 20:57:42

SFINAE不适用于非模板函数。相反,您可以使用专门化(类)或基于重载的分派:

代码语言:javascript
复制
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"; }
};
票数 5
EN

Stack Overflow用户

发布于 2010-11-12 20:55:37

这里没有sfinae。

在知道M<Null>之后,变量ist也是已知的。那么std::enable_if<ist, void>也是定义良好的。您的某个函数定义不明确。

SFINAE仅适用于模板函数的情况。模板函数在哪里?

将代码更改为

代码语言:javascript
复制
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>());
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4164750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档