2

ジェネリック (constexpr、明らかに) 関数をテンプレートに渡す方法を探しています。ラムダを使用せずに、任意の量のパラメーターを取得できる必要があります。これは私がこれまでに持っているものです:

template<typename T, T(*FUNC)()> struct CALL
{
    static inline constexpr decltype(FUNC()) EXEC()
    {
        return FUNC();
    }
};

ただし、これは、渡された関数がパラメーターを取らない場合にのみ機能します。テンプレートに constexpr 関数を受け入れるようにする方法はありますか? std::function を渡してもうまくいかないようです。キーは可変個引数のテンプレート パラメーターだと思いますが、この状況でそれらを利用する方法がわかりません。

4

2 に答える 2

7

あなたが達成しようとしていることを正しく理解していれば、静的関数を持つテンプレート クラスではなく、テンプレート関数を使用できます。

#include <iostream>

template<typename T, typename... Ts>
constexpr auto CALL(T (*FUNC)(Ts...), Ts&&... args) -> decltype(FUNC(args...))
{
    return FUNC(std::forward<Ts>(args)...);
}

constexpr double sum(double x, double y)
{
    return (x + y);
}

int main()
{
    constexpr double result = CALL(sum, 3.0, 4.0);
    static_assert((result == 7.0), "Error!");
    return 0;
}
于 2013-01-12T21:59:47.300 に答える
0
template<int... I>
struct with
{
    template<int F(decltype(I)...)>
    struct call
    {
        static constexpr int value = F(I...);
    };
};

constexpr int f(int i) {return i;}
constexpr int g(int i, int j) {return i + j;}

int main()
{
    int u = with<0>::call<f>::value;
    constexpr int v = with<0, 1>::call<g>::value;
}

これには、私が答える前の質問のように、いくつかの制限があることに注意してください。ただし、コンパイル時に型以外のテンプレート引数から値を生成することもできます。std::integral_constantconstexpr double

#include <iostream>

template<typename T, T... v>
struct with
{
    template<typename R, R f(decltype(v)...)>
    struct call
    {
        static constexpr R value = f(v...);
    };
};

#define AT_COMPILATION(f, x, ...) with<decltype(x), x, ##__VA_ARGS__>::call<decltype(f(x, ##__VA_ARGS__)), f>::value

constexpr long f(long i) {return i;}
constexpr double g(int i, int j) {return static_cast<double>(i) / j;}

int main()
{
    constexpr double u = with<long, 0L>::call<decltype(f(0L)), f>::value;

    std::cout << with<int, 5, 2>::call<double, g>::value << std::endl;

    constexpr double v = AT_COMPILATION(f, 0L);

    std::cout << AT_COMPILATION(g, 5, 2) << std::endl;
}
于 2013-01-13T18:40:03.803 に答える