如何使用c++ 11 type_traits创建自定义元编程测试结构

How to create custom metaprogramming test structs using C++11 type_traits?

本文关键字:自定义 编程 测试 结构 创建 traits c++ 何使用 type      更新时间:2023-10-16

如何在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>();
    // ...
}

我从这里看到了一个可能的is_same实现。我需要这样的东西吗?

可以这样写:

std::cout << "test1: " << std::is_same<A, B>::value << std::endl;

我想这样写:

 std::cout << "test1: " << test1<A, B>::result << std::endl;

您在test1<A,B>::result之前使用typename,但这是不合适的,因为您希望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<>特性遇到了类似的问题,因为它将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>;