Полиморфное использование шаблонов - PullRequest
0 голосов
/ 16 декабря 2011

Здесь контекст полиморфности ожидает 'Derived' от 'Base &.

Учитывая

class P { };
class Q : public P { };
auto operator + (const P& p, int x) -> DYNAMIC_DECLTYPE(P) {
    DYNAMIC_DECLTYPE(P) p2(p);
    p2.func(x);
    return p2;
}

Есть ли способ заставить работать DYNAMIC_DECLTYPE? Я хочу использовать эту форму вместо

template <typename T> T operator + (const T& t, int x)

или иметь потенциально длинный список

if (!strcmp(typeid(p).name(), typeid(derived()).name()) { ... }

потому что последний нельзя использовать для ограничения T на P или его подклассов (докажите, что я не прав, если это возможно).

1 Ответ

1 голос
/ 16 декабря 2011

То, что вы пытаетесь сделать, во всех смыслах этого слова - шаблон шаблона: у вас есть неограниченное семейство возвращаемых типов с соответствующими типами аргументов функции.Это должен быть простой шаблон.

Если вы хотите ограничить допустимые типы, вы должны добавить магию typetrait.Возможно, вот так:

#include <type_traits>

template <typename T>
typename std::enable_if<std::is_base_of<P, T>::value, T>::type
operator+(T const & t, int x)
{
    T s(t);
    s.func(x);
    return s;
}

(Если func возвращает ссылку, вы можете сократить ее до return T(t).func(x);.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...