有没有一种方法可以对类中的所有成员使用`std :: optional`

时间:2020-10-06 17:17:50

标签: c++

考虑课程

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

如果Tstd::optional,则FooFoo2相同,如果T为“无”,则与Foo1。它们不必在形式上完全相同,只要您理解我的意思,便拥有相同的成员类型。

所以我可以写Foo<std::optional> foo2;来使所有成员成为可选成员,或者写Foo<whatever> foo1;来使它们成为非可选成员。

我正在使用C ++ 14,尽管如果这需要超出该标准的技术,我将接受它!

1 个答案:

答案 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;
};