3

我仍在努力掌握元编程,但我很困惑。

我想做的是创建一个类/结构/任何东西,为它提供一个 std::tuple 并让它根据元组中的对象类型自动生成成员函数。目标是让类派生自MessageHandler

例如

typedef std::tuple< MessageA, MessageB, MessageC > MessageSet;

template< class T >
class MessageHandler
{
  // some magic metaprogramming would "create"...
  virtual void processMsg( const MessageA& ) = 0;
  virtual void processMsg( const MessageB& ) = 0;
  virtual void processMsg( const MessageC& ) = 0;
};

我读过你不能在模板中使用虚函数,但我不知道 C++11 是否仍然如此。

谢谢。

4

2 回答 2

5

答案是可变参数模板、部分特化和继承:

//primary template!
template<typename T>
class MessageHandler;

//variadic template, partial specialization and inheritance!
template<typename H, typename ...T>
class MessageHandler<std::tuple<H,T...>>  : public MessageHandler<std::tuple<T...>>
{
    virtual void processMsg( const H& ) = 0;
};

template<typename T>
class MessageHandler<std::tuple<T>>
{
    virtual void processMsg( const T& ) = 0;
};
于 2012-07-29T14:22:23.537 回答
4

你不需要元组来做到这一点:

struct MessageA{};struct MessageB{};struct MessageC{};

template <typename T>
struct message_interface {
  virtual void processMessage(const T& t) = 0;
};

template< typename... Args >
struct message_handler : public message_interface<Args>...
{};

struct message_impl : message_handler<MessageA, MessageB, MessageC>
{
  void processMessage(const MessageA&){}
  void processMessage(const MessageB&){}
  void processMessage(const MessageC&){}
};

int main()
{
  message_impl i;
  return 0;
}

检查参数列表是否是唯一的并且静态断言可能是一个好主意。还要确保它不包含引用类型或其他不受欢迎的东西。当您尝试形成参数类型时,这些通常会以错误告终,但它会给您的用户带来一些麻烦。

编辑:如果您绝对需要支持tuple添加专业化:

template< typename... Args >
struct message_handler< std::tuple<Args...> > : public message_interface<Args>...
{};
于 2012-07-29T14:24:20.467 回答