How to use std :: chrono :: duration as a template parameter?

I have a template class, something like:

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

Now I would like to change Seconds to duration, so the class can be parameterized using std::chrono::duration . For example, I would like to be able to do this:

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

In addition, in the template I would like to specify a default value, for example std::chrono::seconds(30) .

+6
source share
1 answer

You can design your template in a smart way:

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

And then you can instantiate your template as

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

Or, actually having these values ​​as default values, simply

 MyClass < std::string > object; 

Edit:

Given the PaperBirdMaster request, you can restrict the Duration template type to only std::chrono::duration , as follows:

 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; } 
+11
source

Source: https://habr.com/ru/post/983365/


All Articles