c++ - 引用模板参数来定义函数参数的类型
问题描述
我想做这样的事情:
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) { ... }
但是我的完整用例是获取相当多的参数,包括编译时和运行时,我想将它们打包到我的配置对象中并传递它,而不必在几十个处复制许多模板定义函数声明。有没有办法做到这一点?
解决方案
您当然可以将类型别名/静态 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;
}
推荐阅读
- arduino - SIM800L:将网络时间转换为短信内容的字符串
- python-3.x - 同时读取和写入一个 gzip 文件
- python - 加载 json 文件时出现 JSONDecodeError
- sqlalchemy - SQLAlchemy:合并后避免从数据库重新加载大对象
- javascript - body onload 函数在我的示例(JavaScript)中不起作用
- search - Solr 搜索没有给出单个词项的确切结果
- javascript - 如何从浏览器控制台上可见的对象获取数据,但在我的代码上手动遍历它时返回 null?
- c++ - 十六进制到十进制转换器不起作用(c ++)
- angular - 从 ngxs 商店读取
- python - 使用其他模型的属性作为默认值