我正在尝试使代码片段通用,但我很难做到这一点,因为我不完全理解代码中使用的技术是如何工作的。
这里是基于这篇文章的第一个响应的代码,由于某种原因不能处理大于 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;
}
谢谢
最佳答案
答案与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... }... } {}
};
关于c++ - 使此 C++ 代码通用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41429656/