簡體   English   中英

std :: tuple到成員函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM