【发布时间】:2020-12-14 11:32:01
【问题描述】:
是否有可能以某种方式“部分”填充模板模板参数的参数,而不为每个大小引入新类或 using 语句?
我的代码:
#include <vector>
#include <array>
#include <tuple>
struct A { int a = 1; };
struct B { int b = 1; };
struct C { int c = 1; };
template<template<class...> class _Storage, typename... _Components>
struct Foo {
using Storage = std::tuple<_Storage<_Components>...>;
Storage storage;
/* ... do stuff with storage ... */
};
int main() {
Foo<std::vector,A,B,C> fooV; // works
Foo<std::array<...,16>,A,B,C> fooA; // doesn't work
return 0;
}
显然,上面的“fooA”行是无效的 C++,但它表明了我的意图。
- fooV 将创建我的 Foo 类,其中 3 个组件存储在
std::vectors 中,所以std::vector<A>用于 A,std::vector<B>用于 B,等等。 - fooA 将创建我的 Foo 类,其中 3 个组件存储在最大大小为 16 的
std::array中,因此std::array<A, 16>用于 A,std::array<B, 16>用于 B,等等。
实现我的意图的唯一方法是引入模板化 using 语句:
template<typename _T> using MyArray16 = std::array<_T, 16>;
不是很好用:
Foo<MyArray16,A,B,C> fooA; // works
但是,我必须为我需要的每个数组大小引入新的using 类型,这远非最佳。当然,我可以使用#define 轻松做到这一点,并且所有这些都可以避免代码重复,但它仍然远非最佳。
有没有人知道在不引入新类或using 语句的情况下实现此目的的语法方法?
【问题讨论】:
-
不是您问题的答案,但您不应使用以下划线后跟大写字母开头的名称,因为这些名称由编译器保留。不久前还有另一个问题,这实际上导致某些编译器的编译错误
-
真的吗?我在 2005 年一直在做这个,从来没有遇到过任何问题,但很高兴知道谢谢!