kan*_*tar 6 operator-overloading variadic-templates c++11 c++14 c++17
想象一下这样的代码:
struct Foo
{
int foo{0};
};
Foo operator+(const Foo& lhs, const Foo& rhs)
{
Foo ret;
ret.foo = lhs.foo + rhs.foo;
return ret;
}
struct Bar
{
int bar{0};
};
Bar operator+(const Bar& lhs, const Bar& rhs)
{
Bar ret;
ret.bar = lhs.bar + rhs.bar;
return ret;
}
template<typename... Ts>
struct Fooz : public Ts...
{
};
template<typename... Ts>
Fooz<Ts...> operator+(const Fooz<Ts...>& lhs, const Fooz<Ts...>& rhs)
{
// how can you call base class's operator+ here?
}
int main(int argc, char **argv)
{
Fooz<Foo,Bar> fooz1{1,1}; // fooz1.foo == 1; fooz1.bar == 1;
Fooz<Foo,Bar> fooz2{2,2}; // fooz2.foo == 2; fooz2.bar == 2;
// auto fooz3 = fooz1 + fooz2 // fooz3.foo == 3; fooz3.bar == 3;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里需要可变继承,因为我希望将基础结构中的所有成员变量继承到可变参数类(请参阅参考资料main
).
现在的问题是:是否有可能要调用基结构的operator+
内部FooBar
的operator+
功能?
任何帮助表示赞赏!
在 c ++ 17中,如果Fooz
是问题中的聚合类型,则可以复制列表初始化Fooz
为(列表)- 初始化每个直接基类,并具有单独的结果:
template <typename... Ts>
Fooz<Ts...> operator+(const Fooz<Ts...>& lhs, const Fooz<Ts...>& rhs)
{
return { {static_cast<const Ts&>(lhs) + static_cast<const Ts&>(rhs)}... };
}
Run Code Online (Sandbox Code Playgroud)
在c ++ 14中,您还需要提供一个构造函数:
Fooz(const Ts&... ts) : Ts{ts}... {}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
137 次 |
最近记录: |