【问题标题】:C++ - Can a template template parameter be of a variable or function?C++ - 模板模板参数可以是变量或函数吗?
【发布时间】:2015-03-23 20:19:56
【问题描述】:

我仍在尝试完全理解模板。我将它们视为特殊类型。

最近我在阅读关于类的模板模板参数和 我想知道是否可以有一个函数或变量的模板模板参数,而不仅仅是类?像这样的:

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

编辑:如果不是为什么,还有什么替代方案?

【问题讨论】:

  • 您的声明和定义混淆了。什么是模板
  • 我猜一个模板只有一个'int'类型的参数?
  • 你猜错了。没有这样的事
  • template &lt;typename T&gt; class A { T var; }; A&lt;int&gt; myObj
  • @Golazo,肯定有,而且它确实是 TMP 的基础。

标签: c++ templates parameters c++14 iso


【解决方案1】:

我想知道是否可以有一个函数的模板模板参数

不,你不能。您的示例代码 sn-p 不起作用。

template <template <typename T>> void templ_param() = func,

模板模板参数必须是类模板或别名模板。

来自 C++ 标准:

14.3.3 模板模板参数

1 模板template-parametertemplate-argument 应该是类模板或别名模板的名称,表示为id-expression。

【讨论】:

    【解决方案2】:

    不,模板模板参数只能是类型。

    [temp.param]/1 描述模板参数语法如下:

    模板参数:

    • 类型参数
    • 参数声明

    类型参数:

    • type-parameter-key ...opt 标识符opt
    • type-parameter-key 标识符opt= type-id
    • template &lt; template-parameter-list &gt; type-parameter-key ...opt 标识符opt
    • template &lt; 模板参数列表 &gt; type-parameter-key 标识符opt= id 表达式

    类型参数键:

    • class
    • typename

    因此模板模板参数被放入类型参数的类别中,实际上,它们的声明必须在template&lt;...&gt;之后包含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<>();
    }
    

    【讨论】:

    • 你能解释一下为什么以及是否有可能的替代方案吗?
    • 关于原因 - 我认为最好问问 ISO 委员会的人,但即使你这样做,我认为答案将是“没有关于此的提案”。关于替代方案 - 例如,您可以使用静态函数/变量创建模板类。
    • @FISOCPP 我用可能的替代方法更新了我的答案
    猜你喜欢
    • 2020-02-23
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    相关资源
    最近更新 更多