gpt4 book ai didi

c++ - 使用 C++,使用 SFINAE 测试静态成员是否存在,返回错误值

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:49:51 25 4
gpt4 key购买 nike

我正在学习模板元编程。当尝试使用以下代码测试静态成员时,第二个 SFINAE 总是返回错误值:

#include <cstdio>
#include <type_traits>

// ts_a
struct ts_a
{
static int a;
};

// ts_b
struct ts_b
{
static int b;
};

// has_a
template<typename T, typename = std::void_t<>>
struct has_a : std::false_type {};
template<typename T>
struct has_a<T, std::void_t<decltype( T::a )>> : std::true_type {};

// has_b
template<typename T, typename = std::void_t<>>
struct has_b : std::false_type {};
template<typename T>
struct has_b<T, std::void_t<decltype( T::b )>> : std::true_type {};

int main()
{
printf( "%s\n", has_a<ts_a>::value ? "true" : "false" );
printf( "%s\n", has_b<ts_a>::value ? "true" : "false" );
printf( "%s\n", has_a<ts_b>::value ? "true" : "false" );
printf( "%s\n", has_b<ts_b>::value ? "true" : "false" );

return 0;
}

我正在使用 Microsoft (R) C/C++ 优化编译器版本 19.15.26732.1 for x64

true
true
false
false

但是当用 GCC 编译时,它返回预期的值

true
false
false
true

当在 has_a 之前定义 has_b(CTRL-XV has_b before has_a)时,MSVC 返回

false
false
true
true

那么,是编译器的问题吗?

以下替代方案适用于两种编译器,但它也会向非静态成员返回 true。有什么方法可以检测真正的静态成员吗​​?

template <class T>                                                  
struct has_a_2
{
template<typename U>
static std::true_type check( decltype( U::a )* );
template<typename U>
static std::false_type check(...);

public:
static constexpr const bool value = decltype( check<T>( 0 ) )::value;
};

最佳答案

这是一个 MSVC 错误。

错误报告标题为:Expression SFINAE problem已申请。

根据报告中提到的解决方案,此问题已得到修复,并可在最新预览版 Visual Studio 2019 中使用。

这在 GCC 和 Clang 上都能正常工作。

关于c++ - 使用 C++,使用 SFINAE 测试静态成员是否存在,返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55277793/

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