Страницы

Поиск по вопросам

понедельник, 27 мая 2019 г.

Явное приведение типов и lexical_cast

Пример кода:
#include #include
struct A { int a; explicit operator std::string() { return "<" + std::to_string(a) + ">"; }
};
void f(std::string s) { std::cout << s << std::endl; }
int main() { A a {1}; f(static_cast(a)); f(std::string(a)); f((std::string)a); // f(boost::lexical_cast(a)); return 0; }
Вопроса 2:
1) Можно ли запретить приведение типов в С-стиле, так, чтобы на вызов f(std::string(a)) или f((std::string)a) компилятор ругался, а f(static_cast(a)) работало?
2) Как "научить" срабатывать вызов f(boost::lexical_cast(a))?


Ответ

Что касается запрета приведения в стиле C, могу только посоветовать посмотреть в сторону опций компилятора. В GCC, например, можно добавить флаги -Wold-style-cast и -Werror, тогда приведение в стиле C будет вызывать предупреждение, а предупреждения будут трактоваться как ошибки.
С boost::lexical_cast все просто, нужно добавить специализацию шаблона. Ваш пример примет такой вид:
#include #include #include
struct A { int a; explicit operator std::string() const{ return "<" + std::to_string(a) + ">"; } };
namespace boost{ template<> std::string lexical_cast(const A& arg){ return std::string(arg); } };
void f(std::string s) { std::cout << s << std::endl; }
int main() { A a {1}; f(static_cast(a)); f(std::string(a)); f((std::string)a); f(boost::lexical_cast(a)); return 0; }

Комментариев нет:

Отправить комментарий