2015-03-05 20 views
6

Mam klasy szablonu, coś jak:Jak używać std :: chrono :: duration jako parametru szablonu?

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

Teraz chciałbym zmienić Seconds to być czas, więc klasa może być parametryzowane z std::chrono::duration. Na przykład, chciałbym, aby móc to zrobić:

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

Również w szablonie, chciałbym, aby określić wartość domyślną, coś jak std::chrono::seconds(30).

+0

Należy rozważyć przyjmowanie odpowiedź poniżej, wygląda na solidną odpowiedź. –

Odpowiedz

11

Można zaprojektować szablon w sprytny sposób:

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

a następnie można instancji szablonu jako

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

Lub faktycznie mającego te wartości jako domyślne, po prostu

MyClass <std::string> object; 

Edytuj:

Uwzględniając prośba PaperBirdMaster „s, można ograniczyć szablonu Duration typ, być std::chrono::duration tylko w ten sposób:

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

Pozwala to na tworzenie instancji 'MyClass' z czymkolwiek, co nie jest wartością chrono, na przykład:' MyClass ', czy jest to oczekiwane zachowanie? Czy nie powinno być lepiej ograniczyć drugi parametr do typów chrono? –

+0

@PaperBirdMaster Twoja logika może być również zastosowana na przykład do 'std :: remove_if'. Co jeśli ktoś określi coś nieoczekiwanego zamiast "UnaryPredicate p", jeśli zamiast iteratorów? Odpowiedź jest prosta: nie będzie się kompilować. – GreenScape

+1

nie znamy logiki wewnątrz 'MyClass', może skompiluje się z' double' lub 'my_fancy_class' lub wathever z odpowiednimi operatorami i nie może być oczekiwanym zachowaniem ... w każdym razie pytanie dotyczyło parametryzacji class z 'std :: chrono :: duration' nie z niczym, co zachowuje się lub przypomina' std :: chrono :: duration'. –

Powiązane problemy