Предпочитаю std :: string в std :: option для const char * - PullRequest
2 голосов
/ 14 марта 2020

Рассмотрим следующий код -

#include <variant>
#include <string>

int p(std::variant<bool, std::string> v) {
    return v.index();
}

int main() {
    return p("ad");
}

вместо выбора std::string, p будет создан с вариантом, содержащим bool (я хочу std::string), хорошо, это можно исправить с помощью явного указания std::string но это слишком много работы ?, я пытался обеспечить различные перегрузки, но, похоже, это не сработало.

Ответы [ 3 ]

4 голосов
/ 14 марта 2020

Это было исправлено в C ++ 20. См. P0608 для обсуждения этого точного случая.

1 голос
/ 14 марта 2020

Вы можете использовать строковый литерал s для непосредственного создания std::string объекта

return p("ad"s);

Если суффикс недоступен, вам необходимо добавить using namespace std::literals, using namespace std::string_literals или using namespace std::literals::string_literals

Тем не менее, я пробовал ваш код на Wandbox и p("ad") возвращает 1 для меня

1 голос
/ 14 марта 2020

Такой код:

#include <variant>
#include <string>

int p(std::variant<bool, std::string> v) {
    return v.index();
}

template<size_t N>
int p(const char (&s)[N]) {
    return p(std::string(s));
}

int main() {
    return p("ad");
}

возвращает 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...