C# では、次のように記述できます。
class AnyThing<T>
{
static public T Default = default(T);
}
static void Main ()
{
int i = AnyThing<int>.Default;
Console.WriteLine (i==0);
string s = AnyThing<string>.Default;
Console.WriteLine (s == null);
}
私は C++ でテンプレート クラスのような辞書を作成するつもりです。指定されたキーが見つからない場合、dict がジェネリック TVal 型の既定値 (0 アウト) を返すようにしたいと考えています。C# では default(T) コンストラクトが役に立ちますが、C++ では同じことを行う適切な方法がわかりません。
私は試してみましたがT obj = {}
、T* obj = {}
gcc4.7 でうまく動作します。それが言語仕様で定義された構文であるかどうか、このようなコードが移植可能なクロスコンパイラとプラットフォームになるかどうかはわかりません。私の疑いで私を助けてください!前もって感謝します!
PS:
~~~~~~~~~~
呼び出し可能なデフォルト ctor を持たないものであっても、テンプレートが任意のタイプのデフォルト (ゼロアウト) 値を取得するようにするために、次のメカニズムを採用しました (avakar の回答に触発されました):
template<class T>
struct AnyThing
{
static const T& Default ;
private:
static const char temp[sizeof(T)];
};
template<class T> const char AnyThing<T>::temp[] = {};
template<class T> const T& AnyThing<T>::Default = *(T*)temp;
struct st
{
double data;
st()=delete;
};
int main()
{
cout << (int)AnyThing<char*>::Default<<endl; //0
cout << AnyThing<int>::Default<<endl; //0
cout <<AnyThing<st>::Default.data<<endl; //0
}
見栄えは悪いですが、何も問題が発生することはありません。ゼロ化されたオブジェクトは単なる空のメモリの塊に過ぎないからです。私が間違っている?