2
#include <array>
#include <functional>

template<typename T, typename ... Args>
auto make_array(T&& t, Args&& ... args) -> std::array<T, sizeof...(Args)+1> {
    return {std::forward<T>(t), std::forward<Args>(args)...};
}

int main() {
    auto f = [](int i)->int { return i; };
    auto f2 = [](int i)->int { return i*2; };

    auto arr2 = make_array<std::function<int(int)>>(f, f2);

    return 0;
}

有没有办法不在呼叫站点指定模板类型make_array<std::function<int(int)>>

4

1 回答 1

3

可以推导出参数类型。使用ecatmur这个巧妙的解决方案,您可以自动生成正确的对象:std::function<>

template<typename T, typename ... Args>
auto make_array(T&& t, Args&& ... args) -> 
    std::array<make_function_type<T>, sizeof...(Args)+1>
//             ^^^^^^^^^^^^^^^^^^^^^
{
    return {std::forward<T>(t), std::forward<Args>(args)...};
}

#include <iostream>

int main() 
{
    auto f = [](int i)->int { return i; };
    auto f2 = [](int i)->int { return i*2; };

    auto arr2 = make_array(f, f2);
    std::cout << arr2[1](21); // Prints 42

    return 0;
}

这是一个活生生的例子

于 2013-04-09T22:24:34.403 回答