【发布时间】:2016-07-14 23:47:46
【问题描述】:
这是我不久前正在考虑的一个有趣的问题。
给定一个带有底层聚合的 struct:
#include <array>
template <typename T, size_t N>
struct A
{
constexpr A() = default;
template <typename ... Ts>
constexpr A(const T& value, const Ts& ... values); // magic
std::array<T, N> arr; // aggregate
};
你将如何实现可变参数模板构造函数A(const T& value, const Ts& ... values)到
- 接受
T和另一个A<T, N>类型的值 - 根据传递的参数表示的值正确初始化底层聚合
- 尊重聚合的容量
- 支持 C++14 constexpr 规则并且不会引入任何运行时开销
满足以上要求,可以做到以下几点:
int main()
{
A<int, 3> x(1, 2, 3);
A<int, 2> y(1, 2);
A<int, 6> a(x, 1, 2, 3);
A<int, 6> b(1, x, 2, 3);
A<int, 6> c(1, 2, x, 3);
A<int, 6> d(1, 2, 3, x);
A<int, 6> e(x, x);
A<int, 6> f(y, y, y);
return 0;
}
【问题讨论】:
-
y[2]在A<int,3> y(1,2);中的期望值是多少? -
构造函数调用的运行时开销如何?
-
@VaughnCato 感谢您的发现,这是一个错误的输入,现在更新
-
@WojciechFrohmberg a constexpr 意味着内联,所以我们不能谈论调用
标签: c++ templates c++11 c++14 variadic-templates