gpt4 book ai didi

c++ - 如何将模板模板与模板实例进行比较?

转载 作者:可可西里 更新时间:2023-11-01 15:10:19 26 4
gpt4 key购买 nike

首先给大家介绍一个部分解决方案:

template <template <class...> class,
typename ...>
struct is_tbase_of:
std::false_type
{ };

template <template <class...> class Type,
typename ...Args>
struct is_tbase_of<Type, Type<Args...>>:
std::true_type
{ };

在一般情况下,它有效:

is_tbase_of<std::vector, std::is_integral<int>>::value; // false
is_tbase_of<std::vector, std::vector<int>>::value; // true

但是,它不适用于 «meta-returned» 模板模板,例如:

template <template <class ...> class T>
struct quote
{
template <typename ...U>
using type = T<U...>;
};

using QVec = quote<std::vector>;
is_tbase_of<QVec::template type, std::vector<int>>::value; // false...

我已经尝试了很多东西,试图获得第二种类型的模板参数(以比较引用的类型特化),但似乎我无法让它们工作。甚至将 is_tbase_of 专门化为 quote(这是一个不太通用但足够的选项)似乎让我陷入了模板模式匹配的黑暗角落。

最佳答案

您可以检查是否可以更改U<Args...>T<Args...>然后检查结果是否保持不变:

#include <type_traits>
#include <vector>

struct is_tbase_of_impl
{
struct err {};

template <template <class...> class T, class U>
static err test(U*);

template <template <class...> class T, template <class...> class U, class... Args>
static T<Args...> test(U<Args...>*);
};

template <template <class...> class T, class U>
using is_tbase_of
= typename std::is_same< decltype(is_tbase_of_impl::test<T>((U*)0)), U >::type;

template <template <class...> class T>
struct quote
{
template <class... U>
using type = T<U...>;
};

using QVec = quote<std::vector>;

template <class...> struct S {};

static_assert( !is_tbase_of< std::vector, std::is_integral<int> >::value, "" );
static_assert( is_tbase_of< std::vector, std::vector<int> >::value, "" );
static_assert( is_tbase_of< QVec::type, std::vector<int> >::value, "" );
static_assert( !is_tbase_of< std::vector, S<int, int, int> >::value, "" );

int main()
{
}

关于c++ - 如何将模板模板与模板实例进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28854125/

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