繁体   English   中英

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

[英]Variadic template constructor and empty constructor?

我有一个类如下:

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 = {}覆盖第一个构造函数。 有没有办法保持空构造函数?

最好的,莫里茨

由于现有的答案都没有真正解决问题,但是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;
}

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

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

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

但它的确有效。

参数包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...>>;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM