Вывод аргумента функции шаблона с enable_if - ссылка на указатель - PullRequest
0 голосов
/ 14 ноября 2018

Может быть, есть хорошее решение, которое работает на g ++ 4.6. {3,4}? Вы можете зарегистрироваться на https://godbolt.org/

#include <type_traits>
class A{};
class B{};
class C{
    public:
    A* a;
    B* b;
};

template<typename T, typename std::enable_if<std::is_same<typename std::remove_reference<T>::type,A*>::value>::type* = nullptr >
void f(T&& t) { 
    return;
}

int main() { 
    C c;
    auto& cRef = c;
    f(cRef.a);
    f(c.a);
}

g ++ /tmp/enable_if.cpp -std = c ++ 0x

/tmp/enable_if.cpp: In function ‘int main()’:
/tmp/enable_if.cpp:20:13: error: no matching function for call to ‘f(A*&)’
/tmp/enable_if.cpp:20:13: note: candidate is:
/tmp/enable_if.cpp:13:6: note: template<class T, typename std::enable_if<std::is_same<typename std::remove_reference<_MemPtr>::type, A*>::value, void>::type* <anonymous> > void f(T&&)
/tmp/enable_if.cpp:21:10: error: no matching function for call to ‘f(A*&)’
/tmp/enable_if.cpp:21:10: note: candidate is:
/tmp/enable_if.cpp:13:6: note: template<class T, typename std::enable_if<std::is_same<typename std::remove_reference<_MemPtr>::type, A*>::value, void>::type* <anonymous> > void f(T&&)

1 Ответ

0 голосов
/ 14 ноября 2018

Функция, которая позволяет вам использовать параметр шаблона по умолчанию, была введена в C ++ 11.Ваш компилятор фактически не имеет полной поддержки этой функции.В качестве обходного пути вы можете указать std::enable_if как тип возвращаемого значения функции:

template<typename T >
typename std::enable_if<std::is_same<typename std::remove_reference<T>::type,A*>::value>::type f(T&& t) { 
    return;
}
...