【问题标题】:virtual pure function with template, how to make it valid带有模板的虚拟纯函数,如何使其有效
【发布时间】:2017-04-20 22:10:29
【问题描述】:

我遇到这样一个场景:

  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;
}

【问题讨论】:

  • 你能通过接口的参数类型和计数在运行时指定来解释你想要什么吗?
  • 可能使“接口”类模板化,而不是函数,可以解决您的问题
  • templated 成员函数不能是虚拟的。您需要重新考虑您的设计
  • "所以,我需要一个模板函数..." 你的意思是,参数类型是在编译时选择的?否则你的结论没有意义。如果在运行时选择了类型,则不能使用模板
  • @tobi303 我需要使用redis的管道,不想暴露回复对象点,所以我需要这样一个接口来给出结果。请求顺序是任意的,所以类型和顺序应该是任意的,我只是这么认为,不确定正确与否。但是你提醒我它没有在运行时指定,仍然是编译时,谢谢

标签: c++ c++11 templates virtual


【解决方案1】:

你不能有一个“虚拟功能模板”,故事结束。您可以在每个派生类中拥有一个函数模板作为接口。如果客户端代码在没有此接口的派生类的对象上调用此类接口,则会出现编译时错误,从而强制执行该接口。缺点是你不能从基类指针/引用调用这个接口,你可以用通常的虚函数来做

【讨论】:

  • 感谢回复,但我的说法不准确,运行时没有指定,只是随意的。而从基类调用接口应该是个大场景。如果不能实现这样的假设,我只需要重新设计课程。我尝试使用类模板,但似乎也无法满足这种情况。
猜你喜欢
  • 1970-01-01
  • 2012-11-04
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多