Перегрузка, вероятно, является наилучшим способом решения этой проблемы, если только вы не используете другой API, который допускает точно такой же синтаксис как для char *, так и для wchar_t *.
void foo(char const *c) {
std::cout << c << '\n';
}
void foo(wchar_t const *c) {
std::wcout << c << L'\n';
}
Вы также можете использовать шаблоны.Если код фактически не меняется между версиями char и wchar_t, то у вас будет только одна версия:
template<typename CharT>
void foo(CharT const *c) {
std::cout << "foo called\n";
}
Но поскольку для выполнения чего-либо полезного обычно требуется использование аргумента, а для использования аргумента обычно требуется другой код(например, вызов printf для char и wprintf для wchar_t) у вас должна быть версия для каждого типа.С шаблоном вы бы сделали это путем специализации.
template<typename CharT>
void foo(CharT const *c);
template<> void foo<char>(char const *c) { /* char version */ }
template<> void foo<wchar_t>(wchar_t const *c) { /* wchar_t version */ }
Теперь, если у вас есть API, который предоставляет идентичный интерфейс для wchar_t и char посредством перегрузки или специализации, то шаблоны позволяют вам строить поверх этогоимея единую версию для обоих типов с использованием перегруженного API:
// Given the above overloads/template specializations:
template<typename CharT>
void bar(CharT const *c) {
foo(c); // calls foo(char const *) or foo(wchar_t const *) as needed.
}
Но так как вы спрашиваете, есть ли способ узнать внутри функции, что это за тип, кажется, что вы хотите иметьразные версии.В этом случае вам, вероятно, лучше всего использовать перегрузки или учесть различия в перегруженных функциях, чтобы основная функция могла быть одним шаблоном.
Есть еще один вариант, который, вероятно, является плохой идеей.В зависимости от реальных различий вы можете иметь один шаблон, а затем сделать что-то вроде:
template<typename T>
int foo(T const *t) {
if(sizeof T == sizeof wchar_t) {
// wchar_t version
} else {
// char version
}
}
И когда-нибудь C ++ может принять static_if
, и в этом случае вы сможете сделать:
template<typename T>
int foo(T const *t) {
static_if(std::is_same<T,wchar_t>::value) {
// wchar_t version
}
static_if(std::is_same<T,char>::value) {
// char version
}
}