4

私は可変個引数関数を持つクラスを持っています:

class class_name {
  template<ArgTypes.. args>
  some_return_type memberMethod(ArgTypes... args) {
    //stuff...
  }
}

クラス定義ブロック内でこのメソッドのインスタンス化を強制する必要があります。クラスは一連のマクロによって生成されるため、クラス定義ブロックの外側でメソッド名を失います。

ポインターを特殊なメンバー関数 (疑似コード) にコピーして、インスタンス化を強制しようとします。

template<typename Self, typename RetType, typename... ArgTypes>
struct force_instantation_imlp<Self, RetType, type_placeholder, type_placeholder<ArgTypes...>> {
    force_instantation_imlp() {
        using instate = RetType (Self::*)(ArgTypes...);
        instate force = &Self::memberMethod<ArgTypes...>;        
    }
};


class class_name {
  template<ArgTypes.. args>
  some_return_type memberMethod(ArgTypes... args) {
    //stuff...
  }

  force_instantation_imlp<class_name, some_return_type, rest_of_types_deduced_from_context> force_virtual_instantation;
}

type_placeholderパラメータ パックを「フリーズ」するヘルパー テンプレートです。

残念ながら、これによりコンパイルエラーが発生します

error: expected primary-expression before ‘...’ token instate force = &Self::memberMethod<ArgTypes...>;

このエラーは、メンバー関数が可変個引数テンプレートであるという事実に起因すると思います。

クラス定義ブロック内で可変個引数テンプレート メンバー関数のインスタンス化を強制する方法はありますか?

4

1 に答える 1