Я пытался реализовать метапрограмму, которая находит, является ли данный тип указателя const
или нет. т.е.
is_const<TYPE*>::value
должно быть false
is_const<const TYPE*>::value
должно быть true
Ниже приведен код:
template<class TYPE>
struct is_const
{
typedef char yes[3];
template<typename T>
struct Perform
{
static yes& check (const T*&);
static char check (T*&);
};
TYPE it;
enum { value = (sizeof(Perform<TYPE>::check(it)) == sizeof(yes)) };
};
А сообщения об ошибках компилятора:
In instantiation of ‘is_const<int*>’:
instantiated from here
error: no matching function for call to ‘is_const<int*>::Perform<int*>::check(int*&)’
note: candidates are: static char (& is_const<TYPE>::Perform<T>::check(const T*&))[3] [with T = int*, TYPE = int*]
note: static char is_const<TYPE>::Perform<T>::check(T*&) [with T = int*, TYPE = int*]
Мой фокус сместился на сообщение об ошибке. Если вы видите последнюю строку:
note: static char is_const<TYPE>::Perform<T>::check(T*&) [with T = int*, TYPE = int*]
Если мы действительно заменим T = int*
и TYPE = int*
, тогда оно действительно должно соответствовать соответствующей функции (char check()
). Я хочу знать, что здесь происходит не так.