Variadic模板构造函数和空构造函数?

时间:2015-02-03 20:02:55

标签: c++ variadic-templates

我有一个如下课程:

template<typename ... TTypes>
class Composite {
public:
    //Composite() : null(true) { } 
    Composite(TTypes... values) : values(std::make_tuple(values...)), null(false) { }
private:
    bool null;
    std::tuple<TTypes...> values;
};

int main(int argc, char *argv[]) {
    Composite<int, char, int> a1;
}

但是这会导致错误,因为第二个构造函数会使用TTypes = {}覆盖第一个构造函数。有没有办法保留空构造函数?

最佳, Moritz的

3 个答案:

答案 0 :(得分:2)

由于没有一个现有的答案可以真正解决问题,但是注释中隐藏着solution,作者是Piotr Skotnicki,因此我将其重新发布在此处以提高知名度:

#include <tuple>
#include <type_traits>

template<typename ... TTypes>
class Composite {
public:
    Composite() : null(true) { } 

    template <std::size_t N = sizeof...(TTypes), typename std::enable_if<(N>0), int>::type = 0>
    Composite(TTypes... values) : values(std::make_tuple(values...)), null(false) { }
private:
    bool null;
    std::tuple<TTypes...> values;
};

int main(int argc, char *argv[]) {
    Composite<int, char, int> a1;
    Composite<> a2;
}

答案 1 :(得分:0)

我不确定以下解决方法是否适合您:

template<typename ... TTypes>
class Composite : public ValueSet {
public:
    Composite(TTypes... values) { }
};

template<>
class Composite<> : public ValueSet {
public:
    Composite() : ValueSet() { } 
};

但它确实有效。

答案 2 :(得分:0)

参数包TTypes为空的情况会使默认构造函数不明确。如果您计划提供至少1个参数,则可以指定其他参数:

template<typename TType, typename ... TTypes>
class Composite {
public:
    Composite() : null(true) { } 
    Composite(TType first, TTypes... rest) :
      values(std::make_tuple(first,rest...)),
      null(false)
    {
    }
private:
    bool null;
    std::tuple<TType,TTypes...> values;
};

int main(int argc, char *argv[]) {
    Composite<int, char, int> a1;
}

但是,请注意此功能由std::optional提供,因此应该更好地使用它。

template < typename... TTypes >
using Composite = std::optional<std::tuple<TTypes...>>;