Посетитель и шаблонные виртуальные методы

В типичной реализациипосетитель шаблон, класс должен учитывать все варианты (потомки) базового класса. Во многих случаях один и тот же контент методов в посетителе применяется к разным методам. В этом случае идеальным будет виртуальный шаблонный шаблон, но пока это запрещено.

Итак, можно ли использовать шаблонные методы для разрешения виртуальных методов родительского класса?

Дано (основание):

struct Visitor_Base; // Forward declaration.

struct Base
{
  virtual accept_visitor(Visitor_Base& visitor) = 0;
};

// More forward declarations
struct Base_Int;
struct Base_Long;
struct Base_Short;
struct Base_UInt;
struct Base_ULong;
struct Base_UShort;

struct Visitor_Base
{
  virtual void operator()(Base_Int& b) = 0;
  virtual void operator()(Base_Long& b) = 0;
  virtual void operator()(Base_Short& b) = 0;
  virtual void operator()(Base_UInt& b) = 0;
  virtual void operator()(Base_ULong& b) = 0;
  virtual void operator()(Base_UShort& b) = 0;
};

struct Base_Int : public Base
{
  void accept_visitor(Visitor_Base& visitor)
  {
     visitor(*this);
  }
};

struct Base_Long : public Base
{
  void accept_visitor(Visitor_Base& visitor)
  {
     visitor(*this);
  }
};

struct Base_Short : public Base
{
  void accept_visitor(Visitor_Base& visitor)
  {
     visitor(*this);
  }
};

struct Base_UInt : public Base
{
  void accept_visitor(Visitor_Base& visitor)
  {
     visitor(*this);
  }
};

struct Base_ULong : public Base
{
  void accept_visitor(Visitor_Base& visitor)
  {
     visitor(*this);
  }
};

struct Base_UShort : public Base
{
  void accept_visitor(Visitor_Base& visitor)
  {
     visitor(*this);
  }
};

Теперь, когда основание заложено, вот где приходит кикер (шаблонные методы):

struct Visitor_Cout : public Visitor_Base
{
  template <class Receiver>
  void operator() (Receiver& r)
  {
     std::cout << "Visitor_Cout method not implemented.\n";
  }
};

Преднамеренно,Visitor_Cout не содержит ключевое словоvirtual в объявлении метода. Все остальные атрибуты сигнатур методов соответствуют родительскому объявлению (или, возможно,Спецификация).

В целом, этот дизайн позволяет разработчикам реализовать общие функциональные возможности посещения, которые отличаются только типом целевого объекта (объекта, получающего посещение). Приведенная выше реализация является моим предложением для предупреждений, когда реализация производного посетителя не имеет дополнительного метода.

Законно ли это согласно спецификации C ++?

(Я не верю, когда некоторые говорят, что это работает с компиляторомXXX, Это вопрос против общего языка.)

Ответы на вопрос(1)

Ваш ответ на вопрос