gpt4 book ai didi

c++ - 如何检查可能使用 SFINAE 的类型中是否存在字段?

转载 作者:IT王子 更新时间:2023-10-29 00:35:16 26 4
gpt4 key购买 nike

我有一个名为 Traits 的结构,它是类型为 T 的模板,Traits 有一个名为 Size 的字段。当 T 实际上有一个名为 Size 的字段时,代码会编译并且一切正常。但是,当 T 是原生类型时,它显然没有 Size 字段并且代码无法编译

template <class T>
struct Traits
{
static const size_t Size = T::Size;
};

我尝试使用 SFINAE 编写它,但它仍然无法编译

template <class T>
struct Traits
{
static typename std::enable_if<!std::is_fundamental<T>::value, const size_t>::type Size = T::Size;
static typename std::enable_if< std::is_fundamental<T>::value, const size_t>::type Size = sizeof(T);
};

编译错误是

error : redeclaration of `typename std::enable_if<std::is_fundamental<T>::value, const unsigned int>::type Traits<T>::Size'

这没有任何意义,因为编译器认为我正在重新声明 Size,但实际上这是不可能的,因为 T 要么是基本类型,要么不是,所以我希望 Size 只被声明一次。

知道哪里出了问题或如何规避这个问题吗? (使用 gcc 4.8.3)

最佳答案

SFINAE 仅适用于特定环境,而这不是其中之一。 SFINAE 只能在类模板特化和函数模板签名的上下文中使用。将测试移动到类模板特化中,它应该按预期工作:

template <class T, class = void>
struct Traits //default is is fundamental
{
static const size_t Size = sizeof(T);
};
template<class T>
struct Traits<T,std::enable_if_t<!std::is_fundamental<T>::value>>{ //if SFINAE does not remove this it is not fundamental and should have a T::Size
static const size_t Size = T::Size;
}

使用 void_t 直接测试 T 是否具有嵌套大小可能会更好:

template<typename T>
using void_t = void;

template <class T, class = void>
struct Traits //default
{
static const size_t Size = sizeof(T);
};
template<class T>
struct Traits<T,void_t<decltype(T::Size)>>{ //if SFINAE does not remove this T::Size exists
static const size_t Size = T::Size;
}

关于c++ - 如何检查可能使用 SFINAE 的类型中是否存在字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25241345/

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