2016-12-06 2 views
0

я пришел к такому сценарию:виртуальная чистая функция с шаблоном, как сделать его действительным

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

Можете ли вы объяснить, что вы хотите, _ Тип и кол-во параметров интерфейса указаны во время выполнения_? – Danh

+1

Возможно, создание шаблона «интерфейс», вместо шаблона, может решить вашу проблему. – alexeykuzmin0

+1

Функция 'template'd member не может быть виртуальной. Вам нужно переосмыслить свой дизайн. – StoryTeller

ответ

2

Вы не можете иметь "шаблон виртуальной функции", конец истории. У вас может быть шаблон функции в каждом производном классе в качестве интерфейса. Если клиентский код вызывает такой интерфейс на объекте производного класса, который не имеет этого интерфейса, вы получаете ошибку времени компиляции, которая таким образом обеспечивает интерфейс. Недостатком является то, что вы не можете вызвать этот интерфейс из указателя/ссылки базового класса, который вы можете делать с обычной виртуальной функцией.

+0

спасибо за ответ, но мое утверждение неточно, оно не указано во время выполнения, это просто произвольно. И вызвать интерфейс из базового класса должен быть большой сценарий. Если такое предположение не может быть выполнено, мне просто нужно перепроектировать класс. Я пытаюсь использовать шаблон класса, но, похоже, он тоже не может выполнить такой сценарий. – user1590236

Смежные вопросы