我有以下仿函数包装另一个仿函数或lambda函数并自动设置索引参数。一个例子将解释得最好。我可以做到以下几点:
auto f = stx::with_index([](int a, int index){ std::cout << a << " " << index << std::endl; });
f(5);
f(3);
f(9);
输出:
5 0
3 1
9 2
以下是仿函数代码:
template<class FUNC>
class IndexFunctor
{
public:
typedef FUNC FUNC_T;
explicit IndexFunctor(const FUNC_T& func) : func(func), index(0) {}
template<class... ARGS>
void operator ()(ARGS&&... args)
{
func(args..., index++);
}
const FUNC_T& GetFunctor() const
{
return func;
}
int GetIndex() const
{
return index;
}
void SetIndex(int index)
{
this->index = index;
}
private:
FUNC_T func;
int index;
};
template<class FUNC>
IndexFunctor<FUNC> with_index(const FUNC& func)
{
return IndexFunctor<FUNC>(func);
}
现在问题是我想将它用于可能返回值的函数。例如
auto f = stx::with_index([](int a, int index){ return a * index; });
int a = f(5);
但我无法弄清楚如何修改我的仿函数以使其工作。我希望仿函数与返回值的函数和不自动的函数兼容。
有人可以提供一些建议吗? 谢谢!
我正在使用VS2012 Microsoft Visual C ++编译器2012年11月CTP
答案 0 :(得分:6)
您必须更改operator()
返回的内容。
如果您正在使用C ++ 11,则可以使用尾随返回类型。
template<typename... Args>
auto operator ()(Args&&... args)
-> decltype(func(std::forward<Args>(args)..., index++)) //get return type
{
return func(std::forward<Args>(args)..., index++);
}