2017-08-25 66 views
1

假设我有一个类用于表示任何维度中的典型数学向量。我想设计这个类,使它的构造函数接受任意数量的参数,将这些参数转换为long double类型,然后按照它们在参数列表中提供的相同顺序将它们插入到“point_list”向量中。现在未知类型的可变参数构造函数参数列表

class Pvector 
{ 
    private: 
    std::vector<long double> point_list; 

    public: 
    // some magic constructor here 
}; 

,如果所有的参数都是同一类型的,这不会因为我可以只使用一个初始化列表是困难的。但问题是任何参数都可能是不同的类型,并且这仍然需要接受任意数量的参数(至少一个)。从本质上讲,我想能够使用这样的构造:

int i; 
float j; 
double k; 
long double l; 

Pvector vec1(i, j, k, l); 
Pvector vec2(k-i, 5, j); 
Pvector vec3(i, i, j, j, k, k, l, l); 
etc... 

我只是不知道是否有可能有一个可变参数的构造函数接受多种类型,然后暗中将它们转换为长双打前插入他们进入矢量。是否有可能实现这一点,或者如果我想要一个可变参数构造函数,我的所有参数都必须是相同的类型吗?

+4

你有没有考虑只是采取'的std ::矢量'在构造函数中,让'的std :: VECTOR'照顾它?你将不得不使用'Pvector vec1({i,j,k,l});'。 – nwp

+0

我不知道是否可以使用[参数包](http://en.cppreference.com/w/cpp/language/parameter_pack)与构造函数,但它可能值得尝试。 –

+1

我不明白是什么问题。 [只要做到这一点](https://ideone.com/ZvjlT9),没有必要乱用variadic模板 – user463035818

回答

1

你可以做这样的:。

class Pvector 
{ 
public: 
    template <typename ...Ts> 
    Pvector(Ts && ...ts) 
    { 
    point_list.reserve(sizeof...(Ts)); 
    init(std::forward<Ts>(ts)...); 
    } 

protected: 
private: 
    void init() { }; 

    template <typename ...Ts> 
    void init(long double x, Ts && ...ts) 
    { 
    point_list.push_back(x); 
    init(std::forward<Ts>(ts)...); 
    } 

    std::vector<long double> point_list; 
}; 
+0

事实上,它不会破坏一些复制/移动构造函数,这有点棘手。 – Jarod42

0

你可能会写一个模板的构造函数(这是棘手的,人们可以预期,以避免匹配诸如Pvector(Pvector&)事情

class Pvector 
{ 
private: 
    std::vector<long double> point_list; 

public: 
    Pvector() = default; 

    Pvector(const Pvector&) = default; 
    Pvector(Pvector&&) = default; 

    // // SFINAE to avoid to match Pvector(Pvector& t) 
    template <typename T, 
       typename ... Ts, 
       std::enable_if_t<std::is_constructible<std::vector<long double>, T, Ts...>::value 
          && (!std::is_same<Pvector, std::decay_t<T>>::value 
           || sizeof...(Ts) != 0)>* = nullptr> 
    Pvector(T&& t, Ts&&... ts) 
    : point_list{t, ts...} {} 
    }; 

但它会简单一些,只需将矢量作为参数

class Pvector 
{ 
private: 
    std::vector<long double> point_list; 

public: 
    Pvector() = default; 

    Pvector(const Pvector&) = default; 
    Pvector(Pvector&&) = default; 

    Pvector(std::vector<long double>&& v) : point_list(std::move(v)) {} 
}; 

并调用它有额外{}

Pvector vec3({i, i, j, j, k, k, l, l}); 
相关问题