【发布时间】:2019-01-21 08:16:17
【问题描述】:
我想创建一个模板类,它包含另一个类的实例,并使用正确的参数类型转发其 foo 方法之一。是否有一种巧妙的元编程方式对内部方法进行“完美转发”?
template <typename Inner>
class Outer {
private:
Inner inner;
public:
// To-do: replicate foo method of Inner with identical signature,
// how to pick correct T?
void foo(T arg) { inner.foo(arg); }
};
我可以看到两个经典的解决方案,但有没有更好的现代解决方案与元编程?
- 具有部分受保护接口的继承:
Outer可以从Inner公开继承。但是 Inner 也有只能由 Outer 而不是用户调用的方法。可以是protected,好的,但它也紧密耦合了Outer和所有类型的Inner类的实现。Outer的公共接口可以通过Inner中的公共方法任意扩展,这是不可取的。 - 使 foo 成为模板函数
template <typename T> void foo(T&& arg) { inner.foo(std::forward<T>(arg)); }。这是参数的完美转发,但是如果用户使用错误的参数调用foo,则错误报告Inner::foo而不是Outer::foo。这打破了Outer的公共接口提供的封装。
【问题讨论】:
-
我现在不能测试它,但应该可以使用这里描述的get type of first, second etc argument
-
是的,我猜我的是重复的。
using的答案也很简单。
标签: c++ inheritance metaprogramming introspection