模板用的多的人都知道使用模板函数指针时,必须在指定函数指针时就对类型进行指定
template<typename Type>
void aaa (Type&&)
{
}
int main (int argc, char* argv[])
{
std::function<void (int) > f = aaa<int>;
}
但指定函数指针的地方不是函数实际发生调用的地方,所以参数的引用类型对于指针的指定处来说是不必要的依赖,而且指定类型时会明确左右值,这在很多复杂情况下会直接导致显式类型模板函数指针编译不通过(因为入参有左值也有右值)
//这段代码只要不改成拷贝,无论怎么改左右值都无法通过
template<typename Type>
void aaa (Type&&)
{
}
template<typename Func>
class B
{
Func f;
public:
B (Func f) : f (f) {}
template<typename ...Args>
auto invoke() (Args&& ...args)->decltype (f (std::forward<Args> (args)...))
{
return f (std::forward<Args> (args)...);
}
};
template<typename Func>
auto make_B (Func&& f)->B<Func>
{
return B<Func> (std::forward<Func> (f));
}
int main (int argc, char* argv[])
{
auto f = make_B (aaa<int>);
int i = 1;
f.invoke(i);
f.invoke(std::move (i));
}
也就是说需要有一个完成指定非明确类型的模板函数指针的方式,解决办法是仿函数。
class AAAImple
{
template<typename Type>
static void aaa (Type&&)
{
}
public:
template<typename...Args>
auto operator() (Args