[英]std::tuple to member functions
我仍然試圖擺脫元編程,我很難過。
我想做的是創建一個類/ struct / whatever,為它提供一個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是否仍然如此。
謝謝。
答案是可變參數模板,部分特化和繼承:
//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;
};
你不需要元組來做到這一點:
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>...
{};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.