我有一个 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/