【发布时间】:2020-11-08 13:28:33
【问题描述】:
考虑以下代码:
#include <iostream>
template <template<class...> class C>
struct foo {
foo() { std::cout << "base case\n";}
};
template <template<class> class C>
struct foo< C > {
foo() { std::cout << "single param case\n";}
};
template <template<class,class> class C>
struct foo< C > {
foo() { std::cout << "two param case\n";}
};
template <typename T> struct bar1 {};
template <typename T,typename U> struct bar2 {};
template <typename T,typename U,typename V> struct bar3 {};
template <typename...T> struct barN {};
int main() {
foo<bar1> f;
foo<bar2> g;
foo<bar3> h;
foo<barN> n;
}
输出是(gcc10.2@godbolt):
single param case
two param case
base case
base case
假设给定了barX,并且我有其他具有不同数量类型参数的模板。有些可变参数有些不是。
是否可以编写只匹配可变参数模板的特化(上例中的barN)?
【问题讨论】:
-
这样的专业化有什么用?
-
@JeffGarrett 它必须有用吗?它是this question 的后续行动(但我认为它不会增加太多背景信息)。考虑一些为模板参数的不同组合实例化模板的机器,然后你想知道它的数量。我想到了一个模板的测试框架,但我真的没有一个具体的案例。
-
@JeffGarrett 或者更简单。给定一个模板
T,编写一个特征,明确确定T是否是可变参数模板。可以简单地尝试使用不同数量的参数来实例化它,但是默认值的可能性使得很难确定可变性 -
clang 或 gcc 都不能用 c++17 编译它。
-
@Kostas 你知道为什么吗?我将不得不做一些研究,也许会提出另一个问题。然而,
foo的例子对于这个问题来说并不重要,因为无论如何我要求用一些东西来代替foo。
标签: c++ templates variadic-templates template-templates