c++函数映射实现

c++ function map implementation

本文关键字:实现 映射 函数 c++      更新时间:2023-10-16

我一直在摆弄新的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,然后在运行时构建一个元组。我不确定这是否真的有必要,但我的感觉是编译器对所有...解包的支持现在有点不稳定,所以即使你想出了一些应该工作的东西,如果你的编译器不能处理它,我也不会感到惊讶。