C++函数映射实现

标签 c++ templates map functional-programming c++11

我一直在研究新的 C++ 标准中的可变参数模板,并提出了一个映射函数( header + 不包括使用 dec):

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++函数映射实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8235270/

相关文章:

C++ STL : Duplicating code due to missing base-class for iterator and reverse_iterator

java - WeakReference 如何影响这个程序的工作

c++ - 如果分配该数组引发异常,您是否应该释放该数组?

c++ - std::thread 不是使用 Eclipse Kepler MinGW 的命名空间 std 的成员

c++ - 模板函数错误(使用 Boost.Tuples)

templates - GitHub:Template 和 Fork 概念之间有什么区别以及何时使用?

c++ - 将可变参数传递给模板函数时出现编译错误

c++ - 如何识别带有 char 指针的字符串?

c++ - typedef int* intptr 或 typedef int *intptr;

android - osmdroid 标记彼此重叠,是否有类似 z-index 的东西?