LINUX.ORG.RU

Вопрос про шаблоны в C++


0

0

Доброе время суток!
Сразу к сути вопроса: есть такой класс:

class Value {
public:
virtual operator char() const {
throw std::bad_cast();
}

virtual operator short() const {
throw std::bad_cast();
}

// И т.д. для long, int, double...
}

Внимание, вопрос: как, воспользовавшись прелестями шаблонов, заставить компилятор самому генерировать методы ТОЛЬКО для заданных типов?

anonymous

Ответ на: комментарий от Selecter

Жаль...
Проще тогда воспользоваться старым добрым препроцессором:

#define CAST(T) \
virtual operator T() \
{ \
throw std::bad_cast(); \
}

CAST(char)
CAST(int)
CAST(double)

// И т.д.

Мне просто казалось, что все то же самое можно сделать с помощью шаблонов.

anonymous
()

Вопрос можно обобщить...
Есть шаблон:
template<typename T>
void func(T &foo)
{
// ...
}

Существует ли способ заставить компилятор инстанцировать шаблон только для заданных типов? К примеру, меня интересут только варианты func() для char и int, а для всего остального я хочу, чтобы компилятор сообщал об ошибке... Много хочу? :)

anonymous
()
Ответ на: комментарий от anonymous

Я точно не уверен. Может быть местные гуру прояснят ситуацию? Но ИМХО логически это не будет работать только через templates.

Selecter ★★★★
()
Ответ на: комментарий от anonymous

гы. подумал я подумал.. начал было писать - да понял что врядли получится :)

godexsoft
()
Ответ на: комментарий от Selecter

>Никак. Для генерации такого кода тебе нужно юзать, по-моему, m4.

Неправда. Курить Александреску про списки типов и про GenScatterHierarchy

anonymous
()
Ответ на: комментарий от anonymous

например так:

--- [cut here]

namespace impl
{
template<typename T>
void func(T foo)
{
}
} // end of namespace impl

template<typename T>
void func(T foo);


template<>
void func<int>(int foo)
{
impl::func(foo);
}

template<>
void func<char>(char foo)
{
impl::func(foo);
}


int main()
{
func(10);
func('d');

func(1L); // error!

return 0;
}

--- [cut here]

aton
()

Читай Страуструпа про специализацию шаблонов. Именно то, что тебе нужно.

devinull ★★
()
Ответ на: комментарий от aton

Подобный вариант я рассматривал, но, честно говоря, проще воспользоваться cut'and'past'ом в такой (см. выше) задаче, чем все это городить...

anonymous
()
Ответ на: комментарий от anonymous

Авторов cunt'n'paste кода (n в cunt - не опечатка!) - поить йадом! Всех! Независимо от причин, побудивших их к этому злодеянию.

nackyga
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.