2013-09-09 1 views
0
MyClass::MyClass(std::list<int> const& some_sequence) 
    { 
    static_assert(
     std::is_same<decltype(some_sequence),std::list<int>>::value , 
     "some_sequence should be an integer list" 
     ); 
    } 

Как заставить статическую работу утверждать? Важно то, что тип является целым списком. Cheers.Как static_assert, что значение проанализировано как const & является правильным типом?

+0

Я немного смущен: 'some_sequence' имеет тип' const std :: list & '- какой другой тип вы обеспокоены тем, что это может быть? –

+0

@NateKohl: проверка там, чтобы напомнить другим программистам, что существуют структурные причины того, что тип является 'list', и что их нельзя изменять только потому, что профилирование находит их слишком медленными. – arman

+0

Почему бы не оставить комментарий? – chris

ответ

5

Нет необходимости использовать static_assert(...): компилятор удостоверится, что эта функция вызывается с помощью std::list<int>. Если вы хотите, чтобы сделать выше компиляции кода, вам нужно использовать

MyClass::MyClass(std::list<int> const& some_sequence) 
{ 
    static_assert(
     std::is_same<decltype(some_sequence),std::list<int> const&>::value , 
     "some_sequence should be an integer list" 
    ); 
} 

some_sequence объявлен как std::list<int> const& и тип полученный decltype(some_sequence). Однако этот static_assert() никогда не сработает.

+0

Спасибо, я не был уверен, где разместить 'const &'! – arman

+0

И да, я использую эти статические утверждения, чтобы напомнить себе и другим, что тип контейнера структурно важен и что программа потерпит неудачу - вы используете вектор (например). Это должно остановить кого-то позже, решив изменить тип по соображениям производительности. – arman