簡體   English   中英

帶模板的虛擬純函數,如何使其有效

[英]virtual pure function with template, how to make it valid

我來到這樣一個場景:

  1. 需要定義一個接口
  2. 接口的參數的類型和數量是任意的

所以,我需要一個模板函數,並且作為一個接口,它應該是虛擬的,但是對於編譯器來說是無效的,是否有解決方法?

樣例代碼:

struct none
{};

template<typename T>
struct stru_result
{
   int  result_code;
   T    result;

   stru_result() :result_code(0)
   {}
   stru_result(const int& code) :result_code(code)
   {}
   stru_result(const int&code, const T& res) :result_code(code), result(res)
   {}
   stru_result(stru_result&& res) 
   {
      result_code = res.result_code;
      result = std::move(res.result);
   }
   stru_result(const stru_result& res)
   {
      result_code = res.result_code;
      result = res.result;
   }
   void operator = (const stru_result& res)
   {
      result_code = res.result_code;
      result = res.result;
   }
 };

 template<>
 struct stru_result<none>
 {
   int result_code;
   stru_result():result_code(0)
   {}
   stru_result(const int& code):result_code(code)
   {}
 };

class itest
{
public:
    template<typename T, typename ...Args>
    virtual int get_reply_atall(std::tuple<stru_result<T>, stru_result<Args>...>& aoTuple) = 0;
};

class ctest : public itest
{
public:
    ctest() {}
    ~ctest() {}

    template<typename T, typename ...Args>
    int get_reply_atall(std::tuple<stru_result<T>, stru_result<Args>...>& aoTuple) ;
};

template<typename T, typename...Args>
int ctest::get_reply_atall(std::tuple<stru_result<T>, stru_result<Args>...>& aoTuple)
{
    std::tuple<stru_result<T>> firstTuple;
    get_reply_atall<T>(firstTuple);

    std::tuple<stru_result<Args>...> resTuple;
    get_reply_atall(resTuple);

    aoTuple = std::tuple_cat(firstTuple, resTuple);
    return 0;
}

template<>
int ctest::get_reply_atall<int>(std::tuple<stru_result<int>>& aoTuple)
{
    stru_result<int> res = stru_result<int>(0, 1);
    aoTuple = std::make_tuple(res, res);
    return 0;
}

template<>
int ctest::get_reply_atall<char*>(std::tuple<stru_result<char*>>& aoTuple)
{
    char* ptr = "test";
    stru_result<char*> res = stru_result<char*>(0, ptr);
    aoTuple = std::make_tuple(res);
    return 0;
}

故事的結尾不能有“虛擬功能模板”。 您可以在每個派生類中都有一個功能模板作為接口。 如果客戶端代碼在不具有該接口的派生類的對象上調用此類接口,則會出現編譯時錯誤,從而強制執行該接口。 缺點是您不能從基類指針/引用中調用此接口,而您可以使用常規虛函數來完成此操作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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