4

位置N(Nはコンパイル時に既知)で可変個引数テンプレート定数引数の値を取得する正しい方法を知りたいです。たとえば、可変個引数の関数ポインターを引数として受け取るテンプレートがあり、2番目の関数ポインターを取得する必要があるとします。今のところ、私が思いついたのはこれだけです...

typedef int (*func)(int);

template< func... F >
struct testme
{
 inline int getme(int p) const
 {
  return std::array< func , sizeof... (F) >{F...}[1](p);
 }
};

...言うまでもなく、これは非常にハックです。これを行うためのより良い方法はありますか?ありがとう。

編集:

typedeftemplateのコードに基づいて、可変個引数テンプレートの引数として任意の型を受け入れることができるバージョンを作成しました。GCC4.6の実験的なビルドで動作することがテストされています。私はそれが他の誰かに役立つかもしれないと思ったので、そこにあります...

template< std::size_t I, typename T, T... Args >
struct va_lookup;

template< std::size_t I, typename T, T Arg, T... Args >
struct va_lookup< I, T, Arg, Args... >
{
    static_assert(I <= sizeof... (Args), "index is out of bound");
    static constexpr T value = va_lookup< I - 1, T, Args... >::value;
};

template< typename T, T Arg, T... Args >
struct va_lookup< 0, T, Arg, Args... >
{
    static constexpr T value = Arg;
};
4

2 に答える 2

4

あなたはこれらの線に沿って何かを使うことができると私は思います:

template <int Index, int... Args> struct LookupAtIndex;
template <int Index, int First, int... Rest> struct LookupAtIndex<Index, First, Rest...> {
    static constexpr int result = LookupAtIndex<Index - 1, Rest...>::result;
};
template <int First, int... Rest> struct LookupAtIndex<0, First, Rest...> {
    static constexpr int result = First;
};

私はこれをテストしていませんが、少なくとも直感的には正しく動作するはずです。

于 2011-01-24T22:37:46.820 に答える
1

これは、より口当たりの良いソリューションのバリエーションです。

typedef int (*func)(int);

template< func... F >
struct testme
{
    static const std::array< func , sizeof... (F) > ptrs_;

    int getme(int p) const
    {
        return ptrs_[1](p);
    }
};

template< func... F >
const std::array< func , sizeof... (F) >
testme<F...>::ptrs_ = {F...};

ユースケースの基本的な問題の1つは、関数ポインターが整数型ほど簡単にテンプレートメタプログラミングを実行できないことです。

于 2011-01-25T03:05:44.607 に答える