私の目標は、の単純な加算を行うことですと、C++での追加を機能限り、彼らは以下の種類があるようなパラメータの任意の数 -可変個引数は、制約のタイプ
整数(例えば123)
整数(例:「123」)として表現文字列
彼らは他のいくつかのタイプである場合、私はそれらを無視します。
アプローチ
- 私は可変引数関数アプローチを使用しています。
- この関数内では、型をチェックします。タイプがの場合、の場合、再帰的に追加します。そうでなければ、私は議論を無視し、さらに議論を繰り返す。私は私のことを教えて観測を次なさ、しかし
:これは私に期待される答えを与える
// BASE template <typename T> int func(T t) { string type= typeid(t).name(); if (type==typeid(int).name()) return stoi(t); else if (type==typeid(const char*).name()) return atoi(t); else return 0; } // RECUR template<typename T, typename... Args> int func(T t, Args... args) // recursive variadic function { string type = typeid(t).name(); if (type==typeid(int).name()){ int sum = t; return sum+func(args...); } else return func(args...); } // MAIN int main() { // All testing here in MAIN. // [2] int funcres = func('a',1, 2.5000,"123"); cout << funcres << endl; return 0; }
から
は、ここで私は、コードがどのように見えると思うものですコードはフェールセーフではありません。
なぜこの基本機能の行には必須ですか?
if(type == typeid(int).name()) return stoi(t);私はこれを行うと、ちょうど
return t
を呼び出さない場合、私は私の関数を呼び出すとき
、私はエラーを取得します。
Cannot initialize return object of type 'int' with an lvalue of type 'const char *'
タイプが整数の場合は整数を返します。これはすでに指定している場合は意味がありません。
私は何でも後
return stoi(t)
タイプは、その後const char*
冒頭で「日本」や「123」挿入された場合return atoi(t)
を(私が最初の場所で必要とされる理由を理解していないもの)、およびかテンプレートのargリスト[for.egfunc(1,2,2.5000,"123",12);
]の中ののは、コードがこの時点で文句を付ける原因となります。int sum = t;
エラーは上記と同じです。
Cannot initialize return object of type 'int' with an lvalue of type 'const char *'
- 可変引数関数に最善の方法を使用するかの選択肢がありますされていますか?
- これは最善の方法です(追加するために必要なパラメータと任意の種類のパラメータが必要なので、私にはそう思われます)。何が間違っていますか?
'typeid'を使用すると、コンパイル時に(タイプを比較して)できることが起こります。 'name'を使うことによって、それらが実際に同じ型であることを保証することはできません(異なる型は' name'に対して同じ結果を与えることができます)。コンパイラは、ランタイムブランチを実行した後、そのタイプだけをコンパイル時に使用できるようにする(過負荷解決など)ために変数を使用しようとすると文句を言うでしょう。 'int'も唯一の整数型ではありません。 'long int'はどうですか? 'unsigned int'ですか? 'char'は技術的には整数型なので、一般化すれば除外しなければなりません。 'signed char'? – chris