请考虑以下vector
课程:
template<typename T, class Tuple = std::vector<T>>
class vector
{
public:
using size_type = typename Tuple::size_type;
template<class T = Tuple, class = std::enable_if_t<std::is_constructible<T, size_type>::value>>
vector(size_type n)
: m_elements(n)
{ }
template<class T = Tuple, class = std::enable_if_t<std::is_constructible<T, std::initializer_list<T>>::value>>
vector(std::initializer_list<T> init)
: m_elements(init)
{ }
private:
Tuple m_elements;
}; // class vector
template<typename T, std::size_t N>
using static_vector = vector<T, std::array<T, N>>;
template<typename T>
static_vector<T, /* N */> make_static_vector(T... elements) { /* ... */ }
问题在于我想std::array
使用Tuple
,但std::array
无法构建initialiter_list
。这就是我在这种情况下禁用vector
的相应构造函数的原因。 (我知道在任何一种情况下我都可以使用std::copy(init.begin(), init.end(), m_elements.begin()
,但这会产生其他问题。)
因为我想做static_vector<double> x = { 1, 2, 3 };
这样的事情,我认为我最好的选择(随意纠正我)提供像make_static_vector
这样的帮助函数。 (这不像initializer_list
那么漂亮,所以,请再次提出更美妙的解决方案。)
我想写auto x = make_static_vector<double>(1, 2, 3);
。我该如何实施呢?
答案 0 :(得分:0)
一个简单的表格如下:
template <typename T,typename... Elements>
static_vector<T, sizeof...(Elements)>
make_static_vector(Elements... elements)
{
return static_vector<T,sizeof...(Elements)>(elements...);
}
您还需要为矢量创建一个可变参数构造函数:
template <typename... Args>
vector(Args... init)
: m_elements{static_cast<T>(init)...}
{ }
如果您想避免使用需要双精度的整数来缩小错误,则static_cast
是必需的。
如果你想使用完美转发,那么输入会更多,但它的想法是一样的。