È possibile progettare il modello in un modo intelligente:
template < typename T, typename Duration = std::chrono::seconds, int duration_value = 30 >
class MyClass
{
// Now you can use duration here:
// auto duration = Duration(duration_value);
};
E poi è possibile creare un'istanza il modello come
MyClass < std::string, std::chrono::seconds, 30 > object;
Oppure, in realtà avere questi valori come valori predefiniti, semplicemente
MyClass <std::string> object;
Modifica:
Tenendo conto richiesta PaperBirdMaster 's, è possibile limitare il tipo di modello Duration
, per essere std::chrono::duration
solo, in questo modo:
template <typename T>
struct is_chrono_duration
{
static constexpr bool value = false;
};
template <typename Rep, typename Period>
struct is_chrono_duration<std::chrono::duration<Rep, Period>>
{
static constexpr bool value = true;
};
template < typename T, typename Duration = std::chrono::seconds, int duration_value = 30 >
class MyClass
{
static_assert(is_chrono_duration<Duration>::value, "duration must be a std::chrono::duration");
// Now you can use duration here:
// auto duration = Duration(duration_value);
};
int main(int argc, char ** argv)
{
MyClass < std::string, std::chrono::seconds, 1> obj1; // Ok
MyClass < std::string, std::chrono::milliseconds, 1> obj2; // Ok
MyClass < std::string, int, 1> obj3; // Error
return 0;
}
Si dovrebbe considerare di accettare la risposta qui sotto, sembra una risposta solida. –