検索

ホームページ  >  に質問  >  本文

C++模板函数中临时变量初始化问题

有一个模板函数

template<typename T>
void function(T num){
    T tmp;
    memset(&tmp,0,sizeof(tmp));    //现在我是这么初始化的
}

然后我需要在函数里定义一个临时变量

T tmp

但这个T有可能是类类型(string), 也可能是内建类型(int, double)
那我要怎么初始化?
现在我是用memset()初始化的;
但如果sum这对象不在一块连续内存或者他定义时会初始化一些特殊成员, 这种方法就不行...

迷茫迷茫2825日前727

全員に返信(3)返信します

  • 大家讲道理

    大家讲道理2017-04-17 15:27:21

    C++11 の均一な初期化:

    リーリー

    次のように書けるはずです:

    リーリー

    返事
    0
  • 高洛峰

    高洛峰2017-04-17 15:27:21

    @シヒラ

    リーリー

    返事
    0
  • 天蓬老师

    天蓬老师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 は変換されないため、ここでは

    が使用されます。また、float は暗黙的に任意の数値型に変換できます。

    個人的に私の文章は汚いと思うので、もっと良い書き方をお願いしたいです(

    C++11 の場合、上記の記述方法は優れています:) <🎜>

    返事
    0
  • キャンセル返事