2017-11-06 10 views
0

別のテンプレートに基づいたテンプレートの戻り値型を持つ関数を作成しようとしていますが、デフォルトにしたいと思います。それはそれを説明するのは難しいが、ここのコードです:明らかテンプレートのデフォルトのテンプレートが多いテンプレート

template<template<typename ReturnType = float, typename> DurationType = std::chrono::duration<ReturnType, std::milli> > 
ReturnType tick() 
{ 
    high_resolution_clock::time_point currentPoint = high_resolution_clock::now(); 
    DurationType elapsed = currentPoint - mStartTimePoint; 
    mStartTimePoint = currentPoint; 

    return elapsed.count(); 
} 

上記コンパイルされませんが、私がやろうとしていることは、関数の戻りReturnTypefloatまたはdouble可能性)を有し、またの単位を指定しています戻り値の型この場合、デフォルトはミリ秒にします。これは可能ですか?

+0

ここで達成したいことは明確ではありません。関数のテンプレートパラメータに 'DurationType'を宣言するのはなぜですか?唯一のテンプレートのパラメータとして 'ReturnType'を持ち、' ​​DurationType'を 'auto'に置き換えることができます。 –

答えて

1

明示的に何を望みますか、デフォルトを希望していますか?

たとえば、デフォルトのテンプレートを定義し、に依存するデフォルトのDurationTタイプを表すことができます。

template <typename ReturnT = float, 
      typename DurationT = std::chrono::duration<ReturnT, std::milli>> 
ReturnT tick0() 
{ 
    std::chrono::high_resolution_clock::time_point 
     currentPoint { std::chrono::high_resolution_clock::now() }; 

    DurationT elapsed { currentPoint } ; 

    return elapsed.count(); 
} 

のようなもの。しかし、この機能はReturnTとは異なる戻り値の型とDurationTと呼ばれていることを許容できるのですか?

私は次のことを受け入れることができますか?

foo0<long double, std::chrono::duration<float, std::milli>>(); 

私はそうではないと思います。

だから、あなたは1つのタイプのみを表現し、他のタイプは派生するべきだと思います。

デフォルトでstd::chrono::duration<float, std::milli>DurationTを表現し、ReturnTを推測することができます。例で

template <typename DurationT = std::chrono::duration<float, std::milli>> 
decltype(std::declval<DurationT>().count()) tick1() 
{ 
    std::chrono::high_resolution_clock::time_point 
     currentPoint { std::chrono::high_resolution_clock::now() }; 

    DurationT elapsed { currentPoint } ; 

    return elapsed.count(); 
} 

それとも、デフォルトfloatで、ReturnTを発現し、それからDurationTを推測することができます。例:

template <typename ReturnT = float> 
ReturnT tick2() 
{ 
    using DurationT = std::chrono::duration<ReturnT, std::milli>; 

    std::chrono::high_resolution_clock::time_point 
     currentPoint { std::chrono::high_resolution_clock::now() }; 

    DurationT elapsed { currentPoint } ; 

    return elapsed.count(); 
} 
+0

私はテンプレートテンプレートを使用する必要があると思っています...私のテンプレートには別のテンプレートがあるので。 – ChaoSXDemon

+0

@ChaoSXDemon - 便利な場所があります。この場合、私は考えていません。 – max66

関連する問題