使用C ,使用SFINAE测试静态成员的存在,返回错误的值
Using C++, test existence of static member using SFINAE, return wrong value
我正在学习模板元图。尝试使用以下代码测试静态成员时,第二个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( "%sn", has_a<ts_a>::value ? "true" : "false" );
printf( "%sn", has_b<ts_a>::value ? "true" : "false" );
printf( "%sn", has_a<ts_b>::value ? "true" : "false" );
printf( "%sn", has_b<ts_b>::value ? "true" : "false" );
return 0;
}
我正在使用Microsoft(R)C/C 优化编译器版本19.15.26732.1 x64
true
true
false
false
但是,当使用GCC编译时,它返回预期值
true
false
false
true
当定义has_b之前的has_a(ctrl-xv has_b之前has_a之前)时,msvc返回
false
false
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错误。
标题为:表达式Sfinae问题已提交的错误报告。
根据报告中提到的解决方案,此问题是固定的,并且可以在最新的预览Visual Studio 2019中使用。
这在GCC和Clang上都可以正常工作。
相关文章:
- 如何在另一个函数中使用返回值作为参数?
- 使用返回对象的函数处理错误
- 如何使用返回布尔值的函数?
- G++ 编译器是否在未使用返回值的情况下将 constexpr 函数视为常规函数?
- 您能否根据是否使用返回值来保证不同的生存期行为?
- 使用返回不完整类型的函数作为默认参数
- 如何使用返回第 n 个元素的方法创建元组
- 如果使用返回引用的函数初始化"auto"var,为什么它不声明引用类型?
- 使用返回 constexpr 对进行模板实例化
- 如何在 c++ 中使用返回类型导出函数 std::map
- 如何在不使用返回的情况下从函数获取变量的地址(指针)
- 如何在递归中使用返回函数
- 动态使用返回的数组,如何释放其内存
- 如何使用返回矢量C++ DLL
- 为什么我不能在插入的函数调用中直接使用返回的指针作为参数
- 在循环中使用返回向量的函数
- 是使用按引用传递来填充容器更好,还是使用返回值来填充容器更好
- 如何使用 C++ 返回抽象类
- NDK带有JNI的ndk,使用返回类型的非原始类型调用方法
- 在课堂中使用返回值