C++ - 模板模板参数可以是变量或函数吗?
C++ - Can a template template parameter be of a variable or function?
我仍在尝试完全理解模板。我认为它们是特殊类型。
最近我在阅读有关 classes 的模板模板参数和
我想知道是否有可能有一个函数或变量的模板模板参数,而不仅仅是 class?像这样:
template<typename T> void func(T); //template of function 'func'
template<int a> double var = a; //template of variable 'var'
template<template<typename> void templ_param() = func, //parameter template of function
template<int> double templ_param_0 = var //parameter template of variable
> void func1();
编辑:如果不是,为什么以及替代方案是什么?
I'm wondering if it it is possible to have a template template parameter of function
不,你不能。您的示例代码片段将不起作用。
template <template <typename T>> void templ_param() = func,
模板模板参数必须是class模板或别名模板。
来自 C++ 标准:
14.3.3 Template template arugments
1 A template-argument for a template template-parameter shall be the name of a class template or an alias template, expressed as id-expression.
不可以,模板模板参数只能是类型。
[temp.param]/1 描述模板参数语法如下:
template-parameter:
- type-parameter
- parameter-declaration
type-parameter:
- type-parameter-key
...
opt identifieropt
- type-parameter-key identifieropt
=
type-id
template <
template-parameter-list >
type-parameter-key ...
opt identifieropt
template <
template-parameter-list >
type-parameter-key identifieropt=
id-expression
type-parameter-key:
class
typename
所以模板模板参数被归入类型参数的范畴,事实上,它们的声明必须在template<...>
之后包含class
或typename
作为替代方案,您可以将模板函数和变量包装到 类:
template <typename T>
struct FuncWrapper {
static void func(T t) {
std::cout << "in func " << t << std::endl;
}
};
template <int a>
struct VarWrapper {
static constexpr double var = a;
};
template<
template <typename T> class FW = FuncWrapper,
template <int> class VW = VarWrapper>
void func1() {
FW<int>::func(VW<42>::var);
}
int main() {
func1<>();
}
我仍在尝试完全理解模板。我认为它们是特殊类型。
最近我在阅读有关 classes 的模板模板参数和 我想知道是否有可能有一个函数或变量的模板模板参数,而不仅仅是 class?像这样:
template<typename T> void func(T); //template of function 'func'
template<int a> double var = a; //template of variable 'var'
template<template<typename> void templ_param() = func, //parameter template of function
template<int> double templ_param_0 = var //parameter template of variable
> void func1();
编辑:如果不是,为什么以及替代方案是什么?
I'm wondering if it it is possible to have a template template parameter of function
不,你不能。您的示例代码片段将不起作用。
template <template <typename T>> void templ_param() = func,
模板模板参数必须是class模板或别名模板。
来自 C++ 标准:
14.3.3 Template template arugments
1 A template-argument for a template template-parameter shall be the name of a class template or an alias template, expressed as id-expression.
不可以,模板模板参数只能是类型。
[temp.param]/1 描述模板参数语法如下:
template-parameter:
- type-parameter
- parameter-declaration
type-parameter:
- type-parameter-key
...
opt identifieropt- type-parameter-key identifieropt
=
type-idtemplate <
template-parameter-list>
type-parameter-key...
opt identifieropttemplate <
template-parameter-list>
type-parameter-key identifieropt=
id-expressiontype-parameter-key:
class
typename
所以模板模板参数被归入类型参数的范畴,事实上,它们的声明必须在template<...>
class
或typename
作为替代方案,您可以将模板函数和变量包装到 类:
template <typename T>
struct FuncWrapper {
static void func(T t) {
std::cout << "in func " << t << std::endl;
}
};
template <int a>
struct VarWrapper {
static constexpr double var = a;
};
template<
template <typename T> class FW = FuncWrapper,
template <int> class VW = VarWrapper>
void func1() {
FW<int>::func(VW<42>::var);
}
int main() {
func1<>();
}