определить общий шаблон класса C ++ для арифметических c типов и указателей - PullRequest
0 голосов
/ 04 февраля 2020

Мне нужно определить общий шаблонный класс для арифметических c типов и типов указателей.

Ниже приведен код, который я пробовал, но я так и не получил его правильно. Мне нужно реализовать это с помощью g ++ 4.4.7, из-за этого я использую boost.

Вывод должен быть ARITHMETI C, за которым следует POINTER.

//primary template class
template <class T, class Enable = void>
struct Class
{
};


template <class C>
struct Class<C, typename boost::enable_if_c<boost::is_arithmetic<C>::value || boost::is_pointer<C>::value>::type>
{
  static inline typename boost::enable_if_c<boost::is_arithmetic<C>::value, void>::type
  print(const C& obj)
  {
    std::cout << "ARITHMETIC TYPE" << std::endl;
  }

  static inline typename boost::enable_if_c<boost::is_pointer<C>::value, void>::type
  print(const C& obj)
  {
    Class<uint64_t>::print(reinterpret_cast<const uint64_t&>(obj));
    std::cout << "POINTER" << std::endl;
  }
};

int main()
{
  int x = 0;
  Class<int*>::print(&x);
  return 0;
}

1 Ответ

0 голосов
/ 04 февраля 2020

Я распечатал шаблонную функцию и она работает как положено.

template <class C>
struct Class<C, typename boost::enable_if_c<boost::is_arithmetic<C>::value || boost::is_pointer<C>::value>::type>
{
  template <class T>
  static inline typename boost::enable_if_c<boost::is_same<C, T>::value && boost::is_arithmetic<T>::value, void>::type
  print(const T& obj)
  {
    std::cout << "ARITHMETIC TYPE" << std::endl;
  }

  template <class T>
  static inline typename boost::enable_if_c<boost::is_same<C, T>::value && boost::is_pointer<T>::value, void>::type
  print(const T& obj)
  {
    Class<uint64_t>::print(reinterpret_cast<const uint64_t&>(obj));
    std::cout << "POINTER" << std::endl;
  }
};
...