考虑课程
struct Foo1
{
int n;
double m;
};
和
struct Foo2
{
std::optional<int> n;
std::optional<double> m;
};
实际上,成员数大于此。有没有办法我可以将其模板化为一个类,例如
template<class T>
struct Foo
{
T<int> n;
T<double> m;
};
如果T
为std::optional
,则Foo
与Foo2
相同,如果T
为“无”,则与Foo1
。它们不必在形式上完全相同,只要您理解我的意思,便拥有相同的成员类型。
所以我可以写Foo<std::optional> foo2;
来使所有成员成为可选成员,或者写Foo<whatever> foo1;
来使它们成为非可选成员。
我正在使用C ++ 14,尽管如果这需要超出该标准的技术,我将接受它!
答案 0 :(得分:7)
您可以编写一个简单的开关,在类型或可选类型之间进行选择:
template <typename T, bool O = false>
using optionally_optional = std::conditional_t<O, std::optional<T>, T>;
然后,按如下所示使用它:
template <bool O>
struct Foo
{
optionally_optional<int, O> n;
optionally_optional<double, O> m;
};