有一个模板函数
template<typename T> void function(T num){ T tmp; memset(&tmp,0,sizeof(tmp)); //现在我是这么初始化的 }
然后我需要在函数里定义一个临时变量
T tmp
但这个T有可能是类类型(string), 也可能是内建类型(int, double)那我要怎么初始化?现在我是用memset()初始化的;但如果sum这对象不在一块连续内存或者他定义时会初始化一些特殊成员, 这种方法就不行...
业精于勤,荒于嬉;行成于思,毁于随。
C++11 の均一な初期化:
次のように書けるはずです:
@シヒラ
質問者が言いたいことは、パラメータとして0で初期化できる場合は0で初期化してみて、うまくいかない場合はデフォルトのコンストラクタを使用するということだと理解しています。
ここにはいくつかのポイントがあります。1 つは、スカラー型は初期化されず、スタック内のガベージ データを直接使用するため、そのデータは 0 ではないため、直接 T tmp にすることはできません。 2 番目に、C メソッド memset は使用できません。これは、C++ オブジェクトがデフォルトでメモリを割り当てるように構築されることが多いため、ポインターが 0 に設定されている場合、セグメンテーション違反またはメモリ リークが発生します。第三に、オブジェクトが直接返されるため、T に移動コンストラクターがない場合、パフォーマンスが低下する可能性があります。
memset
上記の書き方の原理はこうです。 Int と int の違いを利用すると、C++ はテンプレートを決定するときにより特殊な関数 (またはオーバーロードされた関数) を優先するため、次の init_obj が上記の init_obj よりも優先されます。 Enable は、0 で初期化できない型の導出エラーを生成するために使用されます。C++ の SFINAE ポリシーは、それを上記の 0.f に転送します。整数型は暗黙的にポインターに変換されますが、float は変換されないため、ここでは
init_obj
0.f
C++11 の均一な初期化:
リーリー次のように書けるはずです:
リーリー@シヒラ
リーリー質問者が言いたいことは、パラメータとして0で初期化できる場合は0で初期化してみて、うまくいかない場合はデフォルトのコンストラクタを使用するということだと理解しています。
リーリーここにはいくつかのポイントがあります。1 つは、スカラー型は初期化されず、スタック内のガベージ データを直接使用するため、そのデータは 0 ではないため、直接
T tmp
にすることはできません。 2 番目に、C メソッドmemset
は使用できません。これは、C++ オブジェクトがデフォルトでメモリを割り当てるように構築されることが多いため、ポインターが 0 に設定されている場合、セグメンテーション違反またはメモリ リークが発生します。第三に、オブジェクトが直接返されるため、T に移動コンストラクターがない場合、パフォーマンスが低下する可能性があります。上記の書き方の原理はこうです。 Int と int の違いを利用すると、C++ はテンプレートを決定するときにより特殊な関数 (またはオーバーロードされた関数) を優先するため、次の
が使用されます。また、float は暗黙的に任意の数値型に変換できます。init_obj
が上記のinit_obj
よりも優先されます。 Enable は、0 で初期化できない型の導出エラーを生成するために使用されます。C++ の SFINAE ポリシーは、それを上記の0.f
に転送します。整数型は暗黙的にポインターに変換されますが、float は変換されないため、ここでは