我有一个如下课程:
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的
答案 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...>>;