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<...>

之后包含classtypename

作为替代方案,您可以将模板函数和变量包装到 类:

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<>();
}