Переадресация префекта в шаблонный класс с шаблонами variadi c? - PullRequest
1 голос
/ 08 апреля 2020

Я пытаюсь реализовать шаблон базового класса. Которые принимают строку и n чисел параметров и основываются на строке и передают все заданные аргументы некоторой функции с использованием переадресации префекта. Я написал пример кода для этого.

template <typename T, typename ... Args>
class temp {
    public:
        temp(){};
        ~temp(){};
        T main_fn(const std::string& a, Args&& ... args){
            if(a == "add"){
                return add(std::forward<Args>(args)...);
            }
            else if(a == "sub"){
                return sub(std::forward<Args>(args)...);
            }
            else{
                std::cout << "abc" << std::endl;
            }     
        }  
};

int main(){

  std::cout << std::endl;
  temp<int>* temp_obj = new temp<int>();
  const std::string fn = "add";
  int result = temp_obj->main_fn(fn, 1,2,3);
  std::cout << result << std::endl;

}

Когда я пытаюсь скомпилировать этот код, я получаю следующую ошибку.

 In function 'int main()':
70:43: error: no matching function for call to 'temp<int>::main_fn(const string&, int, int, int)'
70:43: note: candidate is:
40:11: note: T temp<T, Args>::main_fn(const string&, Args&& ...) [with T = int; Args = {}; std::string = std::basic_string<char>]
40:11: note:   candidate expects 1 argument, 4 provided

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 08 апреля 2020

temp<int> имеет функцию-член main_fn(const std::string& a), поскольку в temp<int> больше нет Args....

Если вы хотите параметризовать класс на T, а метод на Args..., то вы можете написать это:

#include <iostream>
#include <string>
template <typename T>
class temp {
    public:
        temp(){};
        ~temp(){};
        template <typename ... Args>
        T main_fn(const std::string& a, Args&& ... args){
            return 42;
        }  
};

int main(){

  std::cout << std::endl;
  temp<int>* temp_obj = new temp<int>();
  const std::string fn = "add";
  int result = temp_obj->main_fn(fn, 1,2,3);
  std::cout << result << std::endl;

}
...