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 に答える