请考虑以下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);
。我需要如何实施?
一个简单的形式如下所示:
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
,如果你想避免使用在需要双打整数缩小错误是必要的。
如果您想使用完美的转发,则需要输入更多内容,但这是相同的想法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句