編集:は完全に私が参加大規模なプロジェクトではテンプレート内で異なるメンバー変数名を使用するにはどうすればよいですか?
をコメントで提案を対処するための質問を書き直し、ラップメッセージは、イベントは、など彼らは共通の祖先を持っていないクラスがたくさんあります異なるグループの異なる人々によって書かれています(そしてそれでも)。
これらのクラス(または構造体)のほとんどは、エラーコードと説明を示すパブリックメンバーを持っています。しかし、それらは大部分が1つのグループ内で使用されており、規約はかなり緩やかであるため、メンバーの中にはerrStr
という名前を付けているものもあれば、errDesc
を使用するものもあります。例えば
:私は、オブジェクトを受け入れ、それが持っているものは何でもメンバ変数の値を出力します関数テンプレートを記述しようとしています
struct X {
// stuff here...
int errCode;
std::string errStr;
};
struct Y {
// stuff here...
int errCode;
std::string errDesc;
};
。擬似コードで
:
template<typename T>
bool logError(T const& x)
{
if (x.errCode == 0)
return true;
// if (T::errStr exists)
// log(x.errStr);
// else if (T::errDesc exists)
// log(x.errDesc);
return false;
}
何の問題を複雑にすることは我々が使用するコンパイラが完全に準拠C++ 11ではありませんVS2012、ということです。
私はstd :: enable_if、std :: is_sameなどをしばらく悩ましてきましたが、今のところ唯一の結果はさまざまなコンパイラエラーの印象的なコレクションです。
@ T.Cによってthisが指し示されました。
VS2012がサポートしているC++ 11の機能を使用すると、非常にうまくいくことが判明しましたが、不安定になり、単純化できるかどうか、あるいは別のソリューションが提供されているのか疑問に思っていました。
ありがとうございました!
比較的古いコンパイラを使用しています。これはSFINAEの簡単なexcersizeですが、私はあなたの古いコンパイラがいかにうまくそれに対処できるか分かりません。あなたが本当にC++に習熟することに興味を持っているのであれば、より良いC++コンパイラが必要です(Linuxではgcc 5.3以降が望ましい)。またはWindowsのポート。 –
これは私の職場で使用されるコンパイラなので、私はそれに固執しています。 –
さて、私のお勧めは、あなたがこのアプローチを使って達成しようとしていたものを達成するための他の方法を見つけることです。不自由な時代遅れのツールを使用する必要がある場合は、実行可能なオプションはありません。この古いコンパイラは、SFINAEのいくつかの形式をサポートすることができるかもしれませんが、あなたの時間を無駄にし、コンパイラで使用できないものを投稿したくありません。 XとYを仮想print()を定義するスーパークラスから派生させ、XとYにprint()を実装して、それが持つメンバ変数をすべて出力してからf()で使用します。 –