c++函数映射实现
c++ function map implementation
我一直在摆弄新的c++标准中的可变模板,并提出了一个映射函数(头+使用decs排除):
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;
}
工作。只要所有的参数都是map的相同类型。如果我把main改成更一般的形式:
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
)进行强制转换,因为似乎一些隐式转换规则在这个模板中不起作用。
如果我的语法不起作用(很可能不起作用,当你没有编译器的时候,...
会很棘手),你可能可以把它重写为一个更详细的函数,在调用函数之前解包每个Ts
,然后在运行时构建一个元组。我不确定这是否真的有必要,但我的感觉是编译器对所有...
解包的支持现在有点不稳定,所以即使你想出了一些应该工作的东西,如果你的编译器不能处理它,我也不会感到惊讶。
相关文章:
- 哈希映射如何在 c++ 中实现?
- 自定义哈希表实现-将字符串映射到整数时出现内存错误
- 在不创建新节点的情况下实现带有映射的trie
- 间隔映射实现
- 为什么此代码在此 Trie 实现中使用映射 c++ 中的指针崩溃?
- 映射构造函数,同时在C++中实现计数器
- 如何在这个哈希映射中实现 AVL 树
- 我的 A* 实现无法正确跟踪"camefrom"映射
- C++通过映射并使用中的方法从基类实现派生类
- 具有良好性能的c++映射实现
- 双向映射是否有更有效的实现
- 高效实现 64 位和 32 位无符号整数之间的双向映射
- 在vf2_sub_graph_iso中使用属性映射实现等效性
- 实现将字符串映射到 C++ 中的数组的哈希表。我一直在"Debug Assertion Failed",我不知道为什么
- 在使用无序多映射实现的有向图中查找循环
- 如何用tbb实现一个将键映射到不同类型值的并发哈希表
- C++多索引映射实现
- 要使用 boost::object_pool 实现映射的自定义分配器,如何使用 boost::object_pool 分
- 不允许使用比较实现C++映射不完整类型
- 使用双链表实现映射