gpt4 book ai didi

c++ - 替换失败不是枚举的错误 (SFINAE)

转载 作者:太空狗 更新时间:2023-10-29 20:29:55 24 4
gpt4 key购买 nike

有没有办法使用 Substitution failure is not an error (SFINAE) for enum?

template <typename T>
struct Traits
{
}
template <>
struct Traits<A>
{
};
template <>
struct Traits<B>
{
enum
{
iOption = 1
};
};

template <T>
void Do()
{
// use Traits<T>::iOption
};

然后,Do<B>();作品和Do<A>();失败。但是,当 iOption 不存在时,我可以提供默认行为。所以我把 Do 的一部分分离出来,变成 DoOption。

template <typename T, bool bOptionExist>
void DoOption()
{
// can't use Traits<T>::iOption. do some default behavior
};
template <typename T>
void DoOption<T, true>()
{
// use Traits<T>::iOption
};
template <T>
void Do()
{
// 'Do' does not use Traits<T>::iOption. Such codes are delegated to DoOption.
DoOption<T, DoesOptionExist<T> >();
};

现在,缺少的部分是 DoesOptionExist<T> - 一种检查结构中是否存在 iOption 的方法。当然 SFINAE 适用于函数名称或函数签名,但不确定它适用于枚举值。

最佳答案

如果你可以使用 C++11,这完全是微不足道的:

template<class T>
struct has_nested_option{
typedef char yes;
typedef yes (&no)[2];

template<class U>
static yes test(decltype(U::option)*);
template<class U>
static no test(...);

static bool const value = sizeof(test<T>(0)) == sizeof(yes);
};

C++03 版本(令人惊讶地)相似:

template<class T>
struct has_nested_option{
typedef char yes;
typedef yes (&no)[2];

template<int>
struct test2;

template<class U>
static yes test(test2<U::option>*);
template<class U>
static no test(...);

static bool const value = sizeof(test<T>(0)) == sizeof(yes);
};

用法:

struct foo{
enum { option = 1 };
};

struct bar{};

#include <type_traits>

template<class T>
typename std::enable_if<
has_nested_option<T>::value
>::type Do(){
}

int main(){
Do<foo>();
Do<bar>(); // error here, since you provided no other viable overload
}

关于c++ - 替换失败不是枚举的错误 (SFINAE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8597394/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com