首页 > 解决方案 > 引用模板参数来定义函数参数的类型

问题描述

我想做这样的事情:

template <typename T, int Size>
struct config {
 T field;
 /* various other things */
}

template <typename C>  //  where C is a specific version of the 'config' object. 
void func(C arg0, C::T arg1, std::array<int, C::Size> &arg2) {
   int i = C::Size;
}

即,我可以根据完整类型选择我的函数参数的类型config吗?

我可以通过列出所有单独的类型来实现这一点:

template <typename T, int Size>
void func(config<T,Size> config, T arg1, std::array<int, Size> &arg2) { ... }

但是我的完整用例是获取相当多的参数,包括编译时和运行时,我想将它们打包到我的配置对象中并传递它,而不必在几十个处复制许多模板定义函数声明。有没有办法做到这一点?

标签: c++

解决方案


您当然可以将类型别名/静态 constexpr 添加到config,但保证函数的第一个参数的唯一方法是实例化config, 是第二种选择。

使用类型别名/静态常量的解决方案:

template <class T, int N>
struct config
{
    using FieldType = T;
    static constexpr int Size = N;

    FieldType field;
};

template <typename C> 
void func(C arg0, typename C::FieldType arg1, std::array<int, C::Size> &arg2) {
   int i = C::Size;
}

推荐阅读