以下の例は、よく知られているイディオムの最小の、あまりよくない例です。
問題は熟語そのものについてではないので、最小限に保つにはコンパイルして醜いです。私は(そこに代替イディオムが存在する場合は、偶数か)可変長引数テンプレートメンバメソッドを紹介する時間が前にそれを変更する方法であるために苦しんだ何タイプ消去と可変テンプレートメンバー関数
struct Foo {
virtual void fn() = 0;
};
template<class T>
struct Bar: public Foo {
void fn() override {
T{}.fn();
}
};
struct S {
void fn() { }
};
int main() {
Foo *foo = new Bar<S>{};
foo->fn();
}
。
明らかに、Foo
クラスのfn
関数を変更することはできません。これは仮想クラスであり、仮想指定子はテンプレートと一緒に使用されないためです。 fn
の指定がBar
の場合も同様です。なぜなら、ベースクラスの何らかの設定をオーバーライドする必要があるからです。
注意。私は強く、この質問は、今まで見た最大のXYProblemのいずれかになりますと思われるために
、私は、実際の問題の簡単な説明を与えることもしたいと思います。
Iは、2つのテンプレートメンバメソッドを公開するクラスを有する:
最初のものではなく、後で使用するために何とかをを格納すべき直ちに使用されていないテンプレートクラス
T
を受け付け。2番目の引数は可変数の引数を受け取ります(実際には可変のテンプレート化されたメンバー関数です)。これらの引数は、新しく作成された
T
のインスタンスに完全に転送される必要があります。
問題ははるかに複雑ですが、これはよく近似しており、目的が何であるかを知ることができます。
編集
私はそれが何らかの形で高階関数に類似していることと思います。
私が意味するところは、問題を解決するのは確かに最初の引数をバインドするためのテンプレート化された関数ですが、私が知っている限り、これまで不可能であったアプローチとこれまで検討してきた他のアプローチはありません。
同じ概念を表現する実行可能なソリューションはありますか?
あなたのより大きな目標は、実行時間とコンパイル時のダイナミズムを組み合わせることです。私は可能ではないと考えられる方法で、しかし、私は、私よりも鮮明な人々が何を思いつくのか興味があります。 – zwol
@zwol私はまったく同じ感じを持っています。だから、私はSOに頼んだのです! :-) – skypjack
間違いなく、*メンバ関数テンプレートは仮想ではありません* –