【发布时间】:2016-01-07 19:48:22
【问题描述】:
我目前正在开发一个函数抽象库。我想将多参数函数抽象为作为索引的单参数函数。 (可选)我想传递一个谓词对象来确定它是否应该运行代码。
using FnType = std::function<void(const unsigned long)>;
template<typename Fn, typename Predicate, typename ... Args>
const FnType make_fn(const Fn &fn, const Predicate &predicate, Args ... args) {
return [&](const unsigned long idx) {
if(predicate(idx)) fn(idx, args ...);
};
}
template<typename Fn, typename ... Args>
const FnType make_fn(const Fn &fn, Args ... args) {
return [&](const unsigned long idx) {
fn(idx, args ...);
};
}
此代码在使用谓词时完美运行。
std::vector<double> data(10);
auto fn = [&](unsigned idx, double d) { data[idx] *= d; };
auto pred = [](unsigned long idx) { return idx % 2 == 0; };
FnType new_fn = make_fn(fn, pred, 2.0);
但是当我尝试不传递谓词时
FnType new_fn2 = make_fn(fn, 2.0);
它返回以下编译时错误消息:
called object type 'double' is not a function or function pointer
if(predicate(idx)) fn(idx, args ...);
^~~~~~~~~
有没有可能说编译器应该使用不使用任何谓词的第二个函数?
【问题讨论】:
-
您可能想要更改您的标题。对 C++ 说“可变参数”会让人心脏病发作
-
“可变参数模板”听起来更好吗? ;)
-
请注意,您有一个错误 - 您按价值获取
args,但您通过引用捕获它们
标签: c++ templates c++11 lambda