【发布时间】:2015-04-19 11:39:10
【问题描述】:
我正在创建一些以数学意义表示函数的类,它们的界面是“数学友好的”。为此,我想创建一个可变参数模板 operator() 方法,它允许用户以这种方式编写定义函数f(x, y) = 2*x + y;,然后通过调用f(4, 5); 获取其值。我无法预测参数的数量(数学函数中的变量数量),所以我决定使用可变参数模板。但是,将 operator() 两次重载为可变参数模板并调用它会导致“模糊调用”错误。有什么方法可以克服它,还是我必须创建两个单独的方法?
//expressions like f(x, y, z) = x*x+y-z
template <typename... Args>
RichFunction<T> &operator()(Args&&... args)
{
mMainLinears.clear();
setMainLinears(args...);
return *this;
}
//expressions like f(5, 4, 3)
template <typename... Args>
T operator()(Args&&... args)
{
Function<T>::assign(mMainLinears, 0, args...);
return Function<T>::value();
}
编辑:整个背景不是很重要。我只需要知道如何重载可变参数模板方法,其中重载版本仅在参数类型上有所不同。
【问题讨论】:
-
不返回
*this,在第一个示例中返回不同的类型?或者根本不需要第一个?还是做 sfinae 类型检查? -
@Rames 您可以按照建议使用一些基本的 sfinae like here
标签: c++ c++11 variadic-templates