如何在 C++11 中编写自定义元编程测试?我想写这样的东西:
#include <type_traits>
#include <iostream>
struct A {};
template <typename T>
struct foo {
typedef typename std::conditional<std::is_pointer<T>::value,
typename std::remove_pointer<T>::type,
T>::type type;
};
template <typename A, typename B>
struct test1{typedef typename std::is_same<A, B>::value result;};
template <typename A, typename B>
struct test2{typedef typename std::is_same<A, typename foo<B>::type>::value result;};
template <typename A, typename B>
void testAll() {
std::cout << std::boolalpha;
std::cout << "test1: " << typename test1<A,B>::result << std::endl; // ERROR: expected ‘(’ before ‘<<’ token
std::cout << "test2: " << typename test2<A,B>::result << std::endl; // ERROR: expected ‘(’ before ‘<<’ token
// ...
}
int main()
{
typedef A type1;
testAll<A, type1>();
typedef const A* type2;
testAll<A, type2>();
// ...
}
我从 here 看到了一个可能的 is_same 实现.我需要这样的东西吗?
可以这么写:
std::cout << "test1: " << std::is_same<A, B>::value << std::endl;
我想这样写:
std::cout << "test1: " << test1<A, B>::result << std::endl;
最佳答案
您正在使用 typename
之前 test1<A,B>::result
,但这是不合适的,因为你想要 result
成为一个值,而不是一个类型。出于同样的原因,你不应该将它定义为 test1<>
中的类型别名。 : 您只是希望它具有由 std::is_same<>::value
返回的相同值 (这是一个 static const bool
成员变量,而不是类型名称)。
你可以这样写:
template <typename A, typename B>
struct test1
{
static const bool result = std::is_same<A, B>::value;
};
这样下面的行将被编译:
std::cout << "test1: " << test1<A,B>::result << std::endl;
但是,您的 test1<>
trait 只不过是 std::is_same<>
的别名而已(使用 result
而不是 value
),并且 C++11 支持别名模板:
template <typename A, typename B>
using test1 = std::is_same<A, B>;
这将使您能够:
std::cout << "test1: " << test1<A,B>::value << std::endl;
test2<>
trait 也有类似的问题,因为它定义了 result
作为类型别名,但是 std::is_same<A, typename foo<B>::type>::value
是一个值,而不是一个类型。
因此您可以再次将其重写如下:
template <typename A, typename B>
struct test2
{
static const bool result = std::is_same<A, typename foo<B>::type>::value;
};
这样下面的行将被编译:
std::cout << "test2: " << test2<A, B>::result << std::endl;
但同样,您也可以定义一个别名模板:
template <typename A, typename B>
using test2 = std::is_same<A, typename foo<B>::type>;
关于c++ - 如何使用 C++11 type_traits 创建自定义元编程测试结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15393746/