c++ - std::array 和 lambda

标签 c++ templates c++11 lambda

#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)>>

最佳答案

可以推导参数类型。与this clever solution通过 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;
}

这是一个live example .

关于c++ - std::array 和 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15913557/

相关文章:

c++ - 比函数引用更有效的方法?

multithreading - 在C++ 0x中创建一个在调用线程之前获取互斥量的线程

css - 覆盖现有 CSS 表规则的最佳方法是什么?

c++ - 在 omnet++ IDE 中找不到 -lC :\SQLAPI\lib\sqlapi. 库

c++ - 为什么 CreateProcess API 调用会导致内存访问冲突?

c++ - 从 DLL 动态加载函数

c++ - 函数模板特化失败 : coding error or MSVC2013 bug?

模板 <char*, char*> 对象的 c++ 排序 vector

c++ - 在不使用它的情况下初始化可能无效的引用是否合法?

c++ - 理解 C++ 共享指针