パックの可変個引数テンプレートの引数リストを反復処理する方法を見つけようとしています。すべての反復と同様に、パックリストに含まれる引数の数を知るための何らかの方法が必要です。さらに重要なのは、パックされた引数リストからデータを個別に取得する方法です。
一般的な考え方は、リストを反復処理し、int型のすべてのデータをベクトルに格納し、char *型のすべてのデータをベクトルに格納し、float型のすべてのデータをベクトルに格納することです。このプロセスでは、引数が入った順序の個々の文字を格納する個別のベクトルも必要です。たとえば、push_back(a_float)を実行すると、単に格納するpush_back('f')も実行されます。データの順序を知るための個々の文字。ここでstd::stringを使用して、単に+=を使用することもできます。ベクトルは単なる例として使用されました。
さて、物事の設計方法は、悪意にもかかわらず、関数自体がマクロを使用して構築されることです。これは実験であるため、必須です。したがって、再帰呼び出しを使用することは文字通り不可能です。これは、これらすべてを格納する実際の実装がコンパイル時に拡張されるためです。マクロを元に戻すことはできません。
考えられるすべての試みにもかかわらず、私はまだこれを実際に行う方法を理解することに固執しています。その代わりに、型を作成し、その型をvaradicテンプレートに渡し、ベクトル内で展開して、それを単純に繰り返すという、より複雑な方法を使用しています。ただし、次のような関数を呼び出す必要はありません。
foo(arg(1), arg(2.0f), arg("three");
だから本当の問題は、どうすればそのようなことなしにできるのかということです。コードが実際に何をしているのかをよりよく理解できるように、現在使用している楽観的なアプローチを貼り付けました。
struct any {
void do_i(int e) { INT = e; }
void do_f(float e) { FLOAT = e; }
void do_s(char* e) { STRING = e; }
int INT;
float FLOAT;
char *STRING;
};
template<typename T> struct get { T operator()(const any& t) { return T(); } };
template<> struct get<int> { int operator()(const any& t) { return t.INT; } };
template<> struct get<float> { float operator()(const any& t) { return t.FLOAT; } };
template<> struct get<char*> { char* operator()(const any& t) { return t.STRING; } };
#define def(name) \
template<typename... T> \
auto name (T... argv) -> any { \
std::initializer_list<any> argin = { argv... }; \
std::vector<any> args = argin;
#define get(name,T) get<T>()(args[name])
#define end }
any arg(int a) { any arg; arg.INT = a; return arg; }
any arg(float f) { any arg; arg.FLOAT = f; return arg; }
any arg(char* s) { any arg; arg.STRING = s; return arg; }
これは厄介なことですが、これは純粋な実験であり、本番コードでは使用されません。それは純粋にアイデアです。それはおそらくもっと良い方法で行われる可能性があります。しかし、このシステムをどのように使用するかの例:
def(foo)
int data = get(0, int);
std::cout << data << std::endl;
end
Pythonによく似ています。それも機能しますが、唯一の問題はこの関数をどのように呼び出すかです。ここに簡単な例があります:
foo(arg(1000));
非常に美的である新しい任意のタイプを構築する必要がありますが、それはそれらのマクロもそうではないということではありません。要点はさておき、私は次のオプションを実行したいだけです:foo(1000);
私はそれができることを知っています、私はある種の反復メソッド、またはもっと重要なことに、パックされた可変個引数テンプレート引数リストのためのいくつかのstd::getメソッドが必要です。私はそれができると確信しています。
また、私はint、float、char *のみをサポートしているので、これが正確にタイプフレンドリーではないことをよく知っています。それは私にとっては問題ありません。他に何も必要ありません。type_traitsを使用して、渡された引数が実際に正しいものであることを検証するチェックを追加して、データが正しくない場合にコンパイル時エラーを生成します。これは純粋に問題ではありません。また、これらのPODタイプ以外のサポートも必要ありません。
マクロとPODのみのタイプの純粋に非論理的で愚かな使用についての議論とは対照的に、建設的な助けを得ることができれば非常に高く評価されます。私は、コードがいかに壊れやすく壊れているかをよく知っています。これは実験的なものであり、後で非PODデータの問題を修正して、よりタイプセーフで使いやすくすることができます。
ご理解のほどよろしくお願いいたします。お役に立てることを楽しみにしております。