Как сделать?
Перегрузка не катит, так как хочется что бы в FixedString<char> был только printf(char *) а не пара printf(char *) и printf(wchar_t *) . Иначе при забытом L в L"hello world" невменяемые сообщения об ошибке внутри моего класса, а не снаружи в месте использования.
template <class Char, int BUF_SIZE>
class FixedString
{
void printf(Char *fmt);
};
template <class Char, int BUF_SIZE>
void FixedString<char, BUF_SIZE>::printf(char *fmt)
{
}
template <class Char, int BUF_SIZE>
void FixedString<wchar_t, BUF_SIZE>::printf(wchar_t *fmt)
{
}
int main()
{
}
test.cpp:12: error: invalid use of undefined type `class Test<char, BUF_SIZE>'
test.cpp:5: error: declaration of `class Test<char, BUF_SIZE>'
test.cpp:12: error: template definition of non-template `void Test<char, BUF_SIZE>::printf(char*)'
test.cpp:17: error: invalid use of undefined type `class Test<wchar_t, BUF_SIZE>'
test.cpp:5: error: declaration of `class Test<wchar_t, BUF_SIZE>'
test.cpp:17: error: template definition of non-template `void Test<wchar_t, BUF_SIZE>::printf(wchar_t*)'
Здравствуйте, _Winnie, Вы писали:
_W>Как сделать? Перегрузка не катит, так как хочется что бы в FixedString<char> был только printf(char *) а не пара printf(char *) и printf(wchar_t *) . Иначе при забытом L в L"hello world" невменяемые сообщения об ошибке внутри моего класса, а не снаружи в месте использования.
Такое решение не пойдет?
template<class Char>
class PrintfPolicy
{
public:
void printf(Char* fmt) {std::cout << "printf(Char*)\n";};
};
template<>
class PrintfPolicy<char>
{
public:
void printf(char* fmt) {std::cout << "printf(char*)\n";};
};
template<>
class PrintfPolicy<wchar_t>
{
public:
void printf(wchar_t* fmt) {std::cout << "printf(wchar_t*)\n";};
};
template <class Char, int BUF_SIZE>
class FixedString : public PrintfPolicy<Char>
{
};
int main()
{
FixedString<char,5> f;
char* ch;
f.printf(ch);
FixedString<wchar_t,5> f2;
wchar_t* wch;
f2.printf(wch);
return 0;
}
Здравствуйте, _DAle_, Вы писали:
_DA>Такое решение не пойдет?
_DA>_DA>template <class Char, int BUF_SIZE>
_DA>class FixedString : public PrintfPolicy<Char>
_DA>{
_DA>};
_DA>
Да, спасибо, красивое решение.
Здравствуйте, _DAle_, Вы писали:
_DA>Здравствуйте, _Winnie, Вы писали:
_W>>Как сделать? Перегрузка не катит, так как хочется что бы в FixedString<char> был только printf(char *) а не пара printf(char *) и printf(wchar_t *) . Иначе при забытом L в L"hello world" невменяемые сообщения об ошибке внутри моего класса, а не снаружи в месте использования.
_DA>Такое решение не пойдет?
_DA>_DA>template<class Char>
_DA>class PrintfPolicy
_DA>{
_DA>public:
_DA> void printf(Char* fmt) {std::cout << "printf(Char*)\n";};
_DA>};
_DA>template<>
_DA>class PrintfPolicy<char>
_DA>{
_DA>public:
_DA> void printf(char* fmt) {std::cout << "printf(char*)\n";};
_DA>};
_DA>template<>
_DA>class PrintfPolicy<wchar_t>
_DA>{
_DA>public:
_DA> void printf(wchar_t* fmt) {std::cout << "printf(wchar_t*)\n";};
_DA>};
_DA>template <class Char, int BUF_SIZE>
_DA>class FixedString : public PrintfPolicy<Char>
_DA>{
_DA>};
_DA>int main()
_DA>{
_DA> FixedString<char,5> f;
_DA> char* ch;
_DA> f.printf(ch);
_DA> FixedString<wchar_t,5> f2;
_DA> wchar_t* wch;
_DA> f2.printf(wch);
_DA> return 0;
_DA>}
_DA>
А как реализовать если есть такой шаблон:
template <class T>
class Test {
public:
printf() {...}
};
В зависимости от типа передаваемых данных (T=char или T=wchar_t) должен вызываться printf() для своей реализации? Как понимаю нужно использовать специализацию? Как можно сделать это для функции в классе, если функция без параметров?
Здравствуйте, Vlads, Вы писали:
V>А как реализовать если есть такой шаблон:
V>template <class T>
V>V>class Test {
V> public:
V> printf() {...}
V>};
V>
V>В зависимости от типа передаваемых данных (T=char или T=wchar_t) должен вызываться printf() для своей реализации? Как понимаю нужно использовать специализацию? Как можно сделать это для функции в классе, если функция без параметров?
здесь, первый пример.