可变参数模板构造函数和空构造函数
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...>>;
相关文章:
- 变分模板递归构造函数问题
- std::转换move构造函数的模板专业化的变体
- C++ 默认构造函数与具有非平凡默认构造函数的变体成员联合
- 具有空构造函数使数组未初始化会使计算速度变慢
- 由于不变成员而具有可能已删除的默认构造函数,因此解决编译器错误
- C++变体:为什么转换构造函数需要大小.(类型)为非零
- C++变体用bool转换构造函数
- 我可以避免在std ::变体中明确编写每个结构的构造函数
- C++构造函数调用变体
- 具有左值和右值的变分模板类构造函数
- 在调用基类构造函数之前修改构造函数参数值
- 不变问题和隐式移动构造函数
- 在构造函数中,我可以获取成员的地址并依靠它们将保持不变
- 哪个模板形参在boost::shared_ptr构造函数中使用一个原始指针
- 带有const实参的c++构造函数
- 如何在构造函数中指定不可推导的模板形参
- c++模板类:没有构造函数实例与实参列表匹配
- c++ 11的构造函数中的花括号形参是什么?
- 继承带有默认实参的构造函数
- 模板类复制构造函数形参,带或不带模板实参