将std :: forward作为默认参数传递?

时间:2013-03-05 06:32:45

标签: c++ templates c++11 function-pointers forward

考虑以下函数将函数作为参数。

template <class Function = std::plus<int> > 
void apply(Function&& f = Function());

此处std::plus<int>是应用的默认函数。 std::plus<int>是一个函数对象,一切运行良好。

现在,我想传递std::forward<int>作为默认参数。 std::forward<int>不是函数对象,这是一个函数指针。怎么做?

template <class Function = /* SOMETHING */ > 
void apply(Function&& f = /* SOMETHING */);

2 个答案:

答案 0 :(得分:2)

我认为这会奏效:

template <class Function = decltype(&std::forward<int>)> 
void apply(Function&& f = &std::forward<int>);

编辑:实际上,也许不是。你最好只是重载它:

void apply() {
  apply(&std::forward);
}

答案 1 :(得分:2)

std::forward<int>的函数指针类型为int &&(*)(int &)。所以你的功能看起来像这样:

template<class T = int &&(*)(int &)>
void apply(T &&t = &std::forward<int>);

看看如何声明std :: forward:http://en.cppreference.com/w/cpp/utility/forward