C++函数映射实现
问题描述:
我一直在与可变参数模板玩弄在新的C++标准,并与地图功能上来(头使用排除DECS +):C++函数映射实现
template<typename T>
T square(T i)
{
return i * i;
}
template <typename T, typename... Ts>
const tuple<Ts...> map(const T f, const Ts...args)
{
return make_tuple(f(args)...);
}
int main(int c, char *argv[])
{
tuple<int, int> t;
int (*fp) (int) = square;
t = map(fp, 6, 8);
cout <<get<0>(t) <<endl;
cout <<get<1>(t) <<endl;
return 0;
}
其中一期工程。只要所有参数对于地图而言都是相同的类型。如果我改变主要使用稍微更一般的形式:
tuple<int, float> t;
t = map(square, 6, 8.0f);
GCC 4.4报告:
In function ‘int main(int, char**)’:
error: no matching function for call to ‘map(<unresolved overloaded function type>, int, float)’
任何想法如何使这项工作?
答
首先,您不能将未解析的函数模板作为指针(或模板参数)传递,只能传递它的实例。这意味着你的模板的第一个参数在本例中以int (*)(int)
的形式传递,而不能通过调用float (*)(float)
实例化。我不确定解决这个问题的最佳方法,但无论如何,这在技术上并不是你所问的。
我没有一个编译器来测试它,但我认为如果您使用std::function
来推断您传入的函数所需的类型,您可能可以将这些参数转换为该函数。就像这样:
template<typename T, typename Ts...>
tuple<Ts...> map(std::function<T (T)> const &f, Ts... args) {
return make_tuple(static_cast<Ts>(f(static_cast<T>(args)))...);
}
见,我认为你需要的功能投两个参数(作为T
)和返回类型(作为Ts
),因为它似乎有些隐式转换规则不是这里面工作模板。
如果我的语法不起作用(它可能不会,...
s是棘手的,当你没有一个编译器),你可能可以重写这是一个更详细的函数它在调用函数之前解压缩每个Ts
,然后随着构建一个元组。我不确定这是否真的有必要,但我的感觉是,编译器支持所有的解压缩包现在都有点不稳定,所以即使你想出了一些应该可以工作的东西,我也不会感到惊讶你的编译器无法处理它。
你是否在滥用命名空间std;'? 'tuple'从哪里来? –
@KerrekSB:他说他删除了'使用decs',这看起来好像清除了'滥用'给我。 –