gpt4 book ai didi

c++ - 可变参数模板可以匹配非可变参数模板吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:15:18 26 4
gpt4 key购买 nike

考虑以下片段:

template<template<class> class T,class U>
struct apply
{
typedef T<U> type;
};

typedef apply<std::tuple,int>::type tuple_of_one_int; //Should be std::tuple<int>

海湾合作委员会 4.8.2。说:

type/value mismatch at argument 1 in template parameter list for [...] struct apply
expected a template of type ‘template<class> class T’, got ‘template<class ...> class std::tuple’

这基本上意味着像 std::tuple 这样的可变参数模板不是 applyT 的有效模板参数。

这是 GCC 错误还是标准强制执行此行为?

最佳答案

如果我错了,请有人纠正我,但从这句话看来它是正确的:

3 A template-argument matches a template template-parameter (call it P) when each of the template parameters in the template-parameter-list of the template-argument’s corresponding class template or [FI 11] template aliasalias template (call it A) matches the corresponding template parameter in the template-parameter-list of P

A(给定模板)必须将它的每个模板参数与 P 的模板模板相匹配。

从本节的第二部分我们了解到限制并不适用于相反的情况,这意味着包含参数包的模板模板可以匹配任何内容。

When P’s template-parameter-list contains a template parameter pack (14.5.3), the template parameter pack will match zero or more template parameters or template parameter packs in the template-parameter- list of A with the same type and form as the template parameter pack in P

你可能已经知道让它工作的方法是

template<template<class> class T,class U>                                       
struct apply
{
typedef T<U> type;
};

template<class T> using tuple_type = std::tuple<T>;
typedef apply<tuple_type,int>::type tuple_of_one_int;

C++11 标准也有一个与您的示例等效的示例。

template <class ... Types> class C { /∗ ... ∗/ };

template<template<class> class P> class X { /∗ ... ∗/ };

X<C> xc; //ill-formed: a template parameter pack does not match a template parameter

最后一条评论完全描述了您的情况,类 C 在这种情况下等同于 std::tuple

关于c++ - 可变参数模板可以匹配非可变参数模板吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20356486/

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