0

次のテンプレート クラスがあります。

template <typename T>
struct timer
{
    T period;

    timer(T p) :
        period(p)
    {}
};

インスタンス化するには、次のことを行う必要があります。

timer<double> t(double(0.0));

timerのクラス定義を改善して、この構文を許可することは可能です:

timer t(double(0.0));

コンパイラーdoubleにコンストラクターの引数から型を推測させますか?

4

2 に答える 2

3

いいえ、できません。演繹は関数でのみ機能します。make_通常の解決策は、新しいインスタンスを返す関数を書くことです。これは C++11 です:

template <typename T>
timer<T> make_timer(T&& p) {
  return timer<T>(std::forward<T>(p));
}

auto t = make_timer(0.0);
于 2012-12-07T02:09:04.167 に答える
3

いいえ、できません。このような状況では、型の推定は行われません。ただし、キーワードと関数テンプレートを使用しautoて簡単にすることもできます。

template<typename T>
timer<T> make_timer(T value) {
    return value;
}

// let the compiler deduce double
auto t = make_timer(0.0);

このautoキーワードの使用は、C++11 標準でのみ有効であることに注意してください。

typedefさらに、この特定の状況では、doubleタイマーを使用できます。

typedef timer<double> timer_d;

timer_d t(0.0);

C++ 11 を使用できる場合は、最初のソリューションを引き続き使用します。

于 2012-12-07T02:09:24.807 に答える