可变参数模板构造函数和空构造函数

Variadic template constructor and empty constructor?

本文关键字:构造函数 变参 参数      更新时间:2023-10-16

我有一个这样的类:

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...>>;