我有一个 Filter 类,它为各种输入重载了 process 方法。

template< typename T >
class Filter
{
public:
    void process(T arr[], size_t len);
    T process(T one_value);
    void process(std::array &arr);
    void process(std::vector &v);
    //... many other variants

    using operator() = process;  // How to write proper?
}

我想简化省略 process 的用户代码: filter.process(values) 将变成 filter(values) 。我不认为为每个变体编写一个重载的 operator() 是个好主意。是否必须存在一个更方便的解决方案?

最佳答案

由于您已经有模板了;为什么不试试可变参数模板呢?

template <typename... Args>
auto operator()(Args&&... args)
// assuming non-reference returns
{
  return process(std::forward<Args>(args)...);
}

或者;如果从某些重载返回了引用(OP中未显示);
template <typename... Args>
decltype(auto) operator()(Args&&... args)
// caters for reference returns
{
  return process(std::forward<Args>(args)...);
}

为了进一步完善和扩大用例;如果需要,以下内容提供了SFINAE友好的行为,并根据编译器提供了更短/更轻松的错误消息;
template <typename... Args>
auto operator()(Args&&... args) -> decltype(process(std::forward<Args>(args)...))
// SFINAE support using a trailing decltype
{
  return process(std::forward<Args>(args)...);
}

关于c++ - 所有重载方法的别名?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36990383/

10-17 02:14