我仍然试图摆脱元编程,我很难过。
我想要做的是创建一个类/ struct / whatever,为它提供一个std :: tuple并让它根据元组中的对象类型自动生成成员函数。目标是让类派生自MessageHandler
e.g。
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是否仍然如此。
感谢。
答案 0 :(得分: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;
};
答案 1 :(得分: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>...
{};