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