2016-09-25 4 views
1

Я хочу исключить тип domain_error, если key типа T недействительный ключ. Но я не знаю, как я мог преобразовать любой тип T в строку, если T::operator std::string() определен, как, например, int не поддерживает это.Excpetion Message: Insert String Представление ошибочного значения

Это Obvioulsy неправильно, так как он работает только для очень специфических типов:

throw std::domain_error("key error: "+static_cast<std::string>(key)); 

Как это может быть сделано?

редактировать

Мое решение после того, как предложение использовать шаблон specilisation

template <class T> std::string to_string(const T t) 
    { 
     return static_cast<std::string>(t); 
    } 

    template <> std::string to_string<unsigned int>(const unsigned int i) 
    { 
     std::stringstream ss; 
     std::string ret; 
     ss << i; 
     ss >> ret; 
     return ret; 
    } 

...

std::string domain_error(const IS& is) const 
    { 
     using namespace IDTranslator_detail; 
     return "key error: "+to_string(is), "error"; 
    } 

...

throw std::domain_error(domain_error(key)); 

ответ

1

Это не может быть как описано, в 100% случаев.

Необходимо указать, что часть контракта для вашего шаблона заключается в том, что любой класс передан как параметр, он должен поддерживать operator std::string.

Вы также можете написать в качестве части вашего договора, что числовые типы также будут разрешены, и вы реализуете это в своем шаблоне в качестве специализации, которая использует std::to_string.

Для надежной реализации, в этой ситуации я хотел бы использовать SFINAE попробовать std::to_string, operator std::string, и если оба терпят неудачу, использовать некоторые мягкий ярлык, как в сообщении исключения «неизвестного типа». Возможно, используйте typeid вместе с моим демаркером моего компилятора, чтобы, по крайней мере, получить имя типа C++.

+0

спасибо, я сделал специализацию шаблона. –