Могу ли я использовать шаблоны C ++ для генерации Unicode / ANSI-вариантов функции вместо использования препроцессора? - PullRequest
0 голосов
/ 02 декабря 2009

У нас есть куча устаревшего кода, который не поддерживает Unicode, поэтому переходный шаблон, который мы используем в нашем коде, - это перемещение функции в файл .inl, изменение char на CHAR_TYPE и затем оберните это так:

#define CHAR_TYPE wchar_t
#define STRING_TYPE std::wstring
#define MyFunctionName MyFunctionNameW
#include "MyFunction.inl"

#undef CHAR_TYPE
#define CHAR_TYPE char
#undef STRING_TYPE
#define STRING_TYPE std::string
#undef MyFunctionName
#define MyFunctionName MyFunctionNameA
#include "MyFunction.inl"

... где MyFunction.inl затем определяет MyFunctionName, используя макросы для генерации как версии «A», так и версии «W».

Это странно, но, к сожалению, это необходимо до тех пор, пока мы не преобразуем весь наш код для поддержки Unicode.

Есть ли альтернативный способ сделать это с помощью шаблонов? Я думаю, что было бы неплохо что-то вроде следующего:

typedef MyFunctionName<wchar_t, std::wstring> MyFunctionNameW
typedef MyFunctionName<char, std::string> MyFunctionNameA

Возможно ли это?

Ответы [ 3 ]

4 голосов
/ 02 декабря 2009

Обновление: Я неправильно понял вопрос, думая, что у вас уже написаны функции A и W, которые вы хотите вызывать через одно имя. У вас действительно есть ситуация, для которой разработаны шаблоны, но я не буду повторять правильный ответ.

Простая перегрузка работает, нет необходимости в шаблонах или дополнительной сложности. Win32 API использует макросы, потому что C не перегружен.

inline
void MyFunctionName(std::wstring const& value) { MyFunctionNameW(value); }
inline
void MyFunctionName(std::string const& value) { MyFUnctionNameA(value); }
3 голосов
/ 02 декабря 2009

Роджер Пэйт полностью прав насчет интерфейса. Вы не должны беспокоиться о суффиксах A и W. Тем не менее, это все еще оставляет проблему реализации. Как вы и ожидали, шаблоны являются правильным решением. А поскольку вам не нужны разные имена, вы можете опустить typedefs. Вы бы просто получили

template <typename TSTRING> void MyFunctionName (TSTRING const&);

0 голосов
/ 02 декабря 2009

да, это возможно, это в основном то, что делают std :: string и std :: wstring, так как они на самом деле являются typedefs std::basic_string<charT,traits,alloc>.

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