Здравствуйте. Есть некоторый класс Код (Text): template <int x, bool flag> class A { private: public: template <class T> void f(); }; Нужно написать 2 реализации функции f для параметра flag = true и для параметра flag = false. Не могу сообразить как это сделать. Так будет правильно? Код (Text): template <class T> template <int x> void A<x, true>::f<T>() { } template <class T> template <int x> void A<x, false>::f<T>() { }
Ещё вопрос по частичной инициализации функций. Пусть есть функция Код (Text): template <int x, bool b> void func(); Я хочу определить 2 реализации для b = true и для b = false. Но так не катит.. Код (Text): template <int x> void func<x, true>() { } template <int x> void func<x, false>() { }
Задачка на самом деле такая. Я хочу в своей библиотеке сделать флажок b_use_exceptions в зависимости от которого будет происходить генерация эксепшнов или нет. Нужно это для того, что некоторые, используемые мной компиляторы (н-п IAR for ARM) не поддерживают работу с исключениями. Сделал что-то типа этого.. Код (Text): static bool const use_exceptions = true; template <int dummy, bool b_use_exceptions> class BasicException { public: template <class t_exception> static void do_throw(const t_exception& exception); }; template <class t_exception> template <int dummy> void BasicException<dummy, true>::do_throw<t_exception>(const t_exception& exception) { throw exception; } template <class t_exception> template <int dummy> void BasicException<dummy, false>::do_throw<t_exception>(const t_exception& exception) { } typedef BasicException<0, use_exceptions> Exception; и далее в программе Код (Text): if (bag) { Exception::do_throw(std::exception("invalid argument")); return; }
cupuyc Частичная специализация шаблонных ф-ций поддерживается только в С++ 0x. Сделайте ф-цию статическим членом шаблонного класса с нужными специализациями. Т.е. параметры шаблона ф-ции вынесите в шаблон класса, а саму ф-цию оставьте нешаблонной.
cupuyc Насколько я могу судить, компилироваться такое не будет. А вот так - должно: Код (Text): template <> template <class t_exception> void BasicException<0, false>::do_throw<t_exception>(const t_exception& exception) { } Впрочем, смотря насколько продвинут ваш компилятор.
cupuyc Не особо шарю в C++, но получил то, что хотел (компилируется MSVC 2010, Comeau 4.3.9 ALPHA C++03 mode): Код (Text): #include <stdexcept> static const bool use_exceptions = true; template <bool> class BaseException { public: template <class t_exception> static void do_throw(const t_exception &exception); }; template <> template <class t_exception> void BaseException<true>::do_throw(const t_exception &exception) { throw exception; } template <> template <class t_exception> void BaseException<false>::do_throw(const t_exception &exception) {} typedef BaseException<use_exceptions> Exception; int main(void) { Exception::do_throw(std::exception()); return 0; } У меня к Вам два вопроса: 1) Не смущает ли Вас то, что Exception::do_throw(std::exception()); в любом случае вызывает конструктор/деструктор исключения? 2) Почему template <class t_exception> static void do_throw(const t_exception &exception);, а не static void do_throw(const std::exception &exception);? Тогда бы, на мой взгляд, было куда симпатичнее: Код (Text): #include <stdexcept> static const bool use_exceptions = true; template <bool> class BaseException { public: static void do_throw(const std::exception &exception); }; template <> void BaseException<true>::do_throw(const std::exception &exception) { throw exception; } template <> void BaseException<false>::do_throw(const std::exception &exception) {} typedef BaseException<use_exceptions> Exception; int main(void) { Exception::do_throw(std::exception()); return 0; }