我正在尝试将代码段设为通用代码,但我无法做到这一点,因为我完全不了解代码中使用的技术是如何工作的。
我从另一个问题获得了代码:C++17 construct array in stack using choosen constructor (same constructor parameter values for each array entry)
以下是基于此帖子的第一个响应的代码,由于某些原因,不能使用大于88的大小: http://ideone.com/WDlNwd
#include <iostream>
#include <utility>
struct A1 {
A1() {
printf("A1() called\n");
}
A1(std::size_t i) {
printf("A1(%d) called\n", i);
}
A1(std::size_t i, std::size_t j) {
printf("A1(%d, %d) called\n", i, j);
}
};
struct A2 {
A2(std::size_t i, std::size_t j, double k) {
printf("A2(%d, %d, %lf) called\n", i, j, k);
}
};
template <class T, size_t Size>
class B {
template<typename Arg1, typename ...Args, size_t... Is>
B(std::index_sequence<Is...>, const Arg1 &arg1, const Args &...args) :
tab{ {(void(Is), arg1), args... }... }
{}
public:
T tab[Size];
B() = default;
template<typename ...Args>
B(const Args &...args)
: B(std::make_index_sequence<Size>(), args...) {}
};
int main() {
static constexpr size_t Size = 100;
B<A1, Size> b1(11, 17);
B<A1, Size> b1a(11);
B<A1, Size> b1b;
B<A2, Size> b2(11, 17, 1.2);
return 0;
}
由于
答案 0 :(得分:1)
答案基本上与the answer you got on the last one相同。唯一的区别是你必须传递零参数的特殊情况。并调整index_sequence
参数的顺序:
struct B {
A tab[100];
//Note: feel free to use SFINAE to make this go away
//if `A` is not default-constructible.
B() = default;
template<typename ...Args>
B(const Args &...args)
: B(std::make_index_sequence<100>(), args...) {}
private:
template<typename Arg1, typename ...Args, size_t... Is>
B(std::index_sequence<Is...>, const Arg1 &arg1, const Args &...args)
: tab{ {(void(Is), arg1), args... }... } {}
};