Могу ли я получить доступ к типу переменной для общего программирования?

Если у меня есть такой код:

std::wstring s(L"...");
bool allCharsEqual = 
        std::find_if(s.begin(), 
                     s.end(), 
                     std::bind1st(std::not_equal_to<std::wstring::value_type>(),
                                  mystring[0]))  // ^^^^^^^^^^^^^^^^^^^^^^^^
        == s.end();

Я хотел бы иметь общее выражение в отмеченном месте, которое также будет работать, если я изменил тип переменной на std::string, Это возможно?

Я понимаю, что мог бы поместить это в дополнительную функцию и шаблонировать ее с типом строки, но есть ли другой способ?

2 ответа

Решение

Ты можешь использовать decltype в C++11:

std::not_equal_to<decltype(s)::value_type>()

Или в C++14 вы можете использовать прозрачные компараторы и просто полностью пропустить аргумент шаблона:

std::not_equal_to<>()

Если вы застряли с C++03, вы можете сделать typedef так что у вас есть только одно место, которое вам нужно обновить, чтобы изменить типы. Это хорошая практика в целом, если вы не можете использовать auto и есть типы, которые вы ожидаете изменить.

typedef std::wstring str_t

Я думаю, что decltype это то, что вы ищете.

Поскольку decltype доступен только в C++11, возможно, создание вашего кода в качестве шаблона поможет, если вам придется писать код до 11

template <typename STRING_TYPE> 
bool allCharsEqual(STRING_TYPE s){
    /* ... */
}
Другие вопросы по тегам