Частичная специализация функций-членов
От: _Winnie Россия C++.freerun
Дата: 05.08.06 23:02
Оценка: 1 (1)
Как сделать? Перегрузка не катит, так как хочется что бы в 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*)'
Правильно работающая программа — просто частный случай Undefined Behavior
Re: Частичная специализация функций-членов
От: _DAle_ Беларусь  
Дата: 06.08.06 00:09
Оценка: 4 (1)
Здравствуйте, _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;
}
Re[2]: Частичная специализация функций-членов
От: _Winnie Россия C++.freerun
Дата: 06.08.06 00:15
Оценка:
Здравствуйте, _DAle_, Вы писали:

_DA>Такое решение не пойдет?


_DA>
_DA>template <class Char, int BUF_SIZE>
_DA>class FixedString : public PrintfPolicy<Char>
_DA>{
_DA>};

_DA>


Да, спасибо, красивое решение.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[2]: Частичная специализация функций-членов
От: Vlads  
Дата: 08.09.06 16:57
Оценка:
Здравствуйте, _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() для своей реализации? Как понимаю нужно использовать специализацию? Как можно сделать это для функции в классе, если функция без параметров?
Re[3]: Частичная специализация функций-членов
От: MuTPu4  
Дата: 09.09.06 23:31
Оценка:
Здравствуйте, Vlads, Вы писали:

V>А как реализовать если есть такой шаблон:

V>template <class T>

V>
V>class Test {
V>  public:
V>  printf() {...}

V>};
V>


V>В зависимости от типа передаваемых данных (T=char или T=wchar_t) должен вызываться printf() для своей реализации? Как понимаю нужно использовать специализацию? Как можно сделать это для функции в классе, если функция без параметров?

здесь, первый пример.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.