【发布时间】:2018-12-09 06:07:17
【问题描述】:
我想编写一个函数,采用T 类型的N 参数。用例是使用初始化列表初始化类中的数组。
Vector<uint8_t, 3> vector {5, 4, 3}
Vector<uint16_t, 2> vector2 {90, 7}
我不使用std::initalizer 列表的原因是对于我开发的平台,没有可用的标准库。因此我尝试了一些自制的integer_list(类似于std的方法)。
template <uint8_t ... Ints >
class IndexSequence {};
这很好用(Array 也类似于std::array):
template <typename T, uint8_t I>
using ParamPack = T;
template <typename T, uint8_t N, typename I = makeIndexSequence<N>>
class Test;
template <typename T, uint8_t N, uint8_t... I>
class Test<T, N, IndexSequence<I...>> {
public:
Test(ParamPack<T, I>... v)
: data {v...} {}
private:
Array<T,N> data;
};
但我不太喜欢这种从 integerSequece 中提取整数参数包的“技巧”,因为整数参数包现在是类模板的一部分。我实际上更喜欢它只是在构造函数的模板中,甚至没有任何模板。
例如这样的:
Test(ParamPack<T, makeIndexSequence<N>.getParamPack()>... v)
或类似的东西。在我看来,这会更干净。
有什么方法可以从integerSequence 中提取参数包,而类模板中没有参数包?
我尝试对函数模板使用相同的技巧。不幸的是,它不起作用,因为函数不能部分特化。
也许你甚至有一个完全不同的方法来拥有类似std::initializer_list 或特定类型的参数包(我知道只使用可变参数模板并将其转换为 T 的可能性,但我想避免如果有更好的解决方案,请这样做)。
【问题讨论】:
-
您是否听说过 C++/标准库的“独立”实现,它只包含标准库的零成本部分?其次,作为类的一部分的名称是问题所在;调试?符号长度?随机squick?
-
我猜这是标准库的一个端口?我的平台是 avr,一个 8 位微控制器。我认为存在一些移植标准的尝试,但它们不是很好。我不想这样的原因是我想使用它的类,实际上也是一个部分专业化。然后我在基类等中也有这个模板参数......这是可能的,但它使代码看起来比它应该的更复杂
-
如果数组类似于
std::array,那么您可以使用聚合初始化。你的类是否建立了任何不变量? -
聚合初始化用于创建数组。它基本上只是一个包装器中的 c 数组。但是在我使用它的课程中,它是私有的,所以我想我不能使用聚合初始化。我实现了这样的构造函数: Test(Array
&& data); ...所以我可以像这样使用它... Test test {{1,2,3}}; ...但我不喜欢双括号...只是语法糖:) -
@Leon0402 用 _iner_array 之类的非平凡名称将其公开怎么样。访问控制很容易被绕过。而且您不会是第一个这样做的人:所有
std::array的内部 c 数组是公共成员。
标签: c++