gpt4 book ai didi

c++ - 如何使用模板模板参数专门化类模板?

转载 作者:搜寻专家 更新时间:2023-10-31 01:37:14 25 4
gpt4 key购买 nike

我想在模板模板参数的类型模板参数上专门化一个类模板。是否可以?如果是,语法是什么?

#include <type_traits>

template <typename T>
struct X {};

// primary template
template<template<class> class C>
struct Z : std::false_type {};

// specialization on the template template parameter
template<>
struct Z<X> : std::true_type {}; // OK

// specialization on the type template parameter of the
// template template parameter
template <template<class> class C>
struct Z<C<int>> {}; // ERROR

动机:假设模板模板参数表示集合(例如 std::vectorstd::deque)。我想在 std::vector 上专门研究 Z 但我对 std::vector 的类型模板参数不感兴趣,没关系.我还想专注于所有 Collection 类型,它包含一个 int

这道题和下面的题很相似,不过它们要么是想特化一个函数模板

或者他们试图不专注于模板模板参数

或者主模板中没有模板模板参数

最佳答案

下面的代码可以正常编译:

#include <type_traits>

template <typename T>
struct X {};

// primary template, no template template parameter
template<typename T>
struct Z : std::false_type {};

// specialization on the template template parameter with arbitrary T
template<typename T>
struct Z<X<T>> : std::true_type {};

// here's where you need the template template parameter
template <template<class> class C>
struct Z<C<int>> : std::true_type {};

int main()
{
static_assert(!Z<Z<double>>::value, "" );
static_assert( Z<Z<int >>::value, "" );
static_assert( Z<X<double>>::value, "" );
// static_assert( Z<X<int >>::value, "" ); // error: ambiguous
// partial specialization
}

在您的代码中,您为 Z 提供了一个模板模板参数,即使这样做只是为了特化。这就是您的代码无法编译的原因。

关于c++ - 如何使用模板模板参数专门化类模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34426292/

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