[英]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.