Как я могу использовать std::chrono:: duration в качестве параметра шаблона?

у меня есть шаблонный класс, что-то вроде:

template < typename T, size_t Seconds > class MyClass {}

теперь я хотел бы изменить секунды на длительность, чтобы класс можно было параметризовать с помощью std::chrono::duration. Например, я хотел бы иметь возможность сделать это:

MyClass < std::string, std::chrono::seconds(30) > object;

кроме того, в шаблоне я хотел бы указать значение по умолчанию, что-то вроде std::chrono::seconds(30).

1 ответов


вы можете создать свой шаблон умным способом:

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);
};

и затем вы можете создать свой шаблон как

MyClass < std::string, std::chrono::seconds, 30 > object;

или, фактически имея эти значения по умолчанию, просто

MyClass < std::string > object;

Edit:

принимая во внимание PaperBirdMasterзапрос, вы можете ограничить шаблона Duration тип, чтобы быть std::chrono::duration только так:

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;
}