В C ++ 14 были введены шаблоны переменных .
Таким образом, используя специализацию шаблона, можно предоставить переменную с тем же именем, но разные значения для разных типов.
Чтобы проиллюстрировать возможное решениеh, я сделал следующий MCVE:
#include <iostream>
template <typename T>
constexpr const T *init;
template <>
constexpr const char *init<char> = "string";
template <>
constexpr const wchar_t *init<wchar_t> = L"wstring";
template <typename T>
struct simplestring {
const T *str;
simplestring(const T *str = init<T>): str(str) { }
};
int main()
{
simplestring<char> str;
std::cout << "str: " << str.str << '\n';
simplestring<wchar_t> wStr;
std::wcout << "wStr: " << wStr.str << '\n';
}
Вывод:
str: string
wStr: wstring
Живая демонстрация на coliru
Шаблон переменной как static const
член template class simplestring
:
#include <iostream>
template <typename T>
struct simplestring {
static const T *init;
const T *str;
simplestring(const T *str = init): str(str) { }
};
template <>
const char *simplestring<char>::init = "string";
template <>
const wchar_t *simplestring<wchar_t>::init = L"wstring";
int main()
{
simplestring<char> str;
std::cout << "str: " << str.str << '\n';
simplestring<wchar_t> wStr;
std::wcout << "wStr: " << wStr.str << '\n';
}
Вывод:
str: string
wStr: wstring
Демонстрация жизни на coliru