Правильный способ использования вариационного шаблона функции вызова со строковыми аргументами C ++ -- c++ поле с участием c++11 пол Связанный проблема

Proper way of using Variadic template function call with string arguments c++


0
vote

проблема

русский

Здравствуйте, что не то, что я здесь делаю, используя вариадические шаблоны через строку? Как правильно использовать его для достижения заданий ниже?

 <код> #include <iostream> #include<string>  int sum(int a, int b, int c, int d) { return a+b+c+d; } int strcopy(char* str)   { strcpy(str,"Hello World!!!"); return 1; }  template<typename Func, typename... Args> auto MainCall(Func func, Args&&... args)-> typename std::result_of<Func(Args...)>::type {     return func(std::forward<Args>(args)...); }  template<typename... funcname, typename... Args> int CallFunction(std::string const& Func , Args&&... args) {      if(!Func.compare("sum"))     {         return MainCall(sum, args...);     }     else if(!Func.compare("strcopy"))     {         return MainCall(strcopy, args...);     }     else     {         return 0;     }  }   int _tmain(int argc, _TCHAR* argv[]) {     char buffer[512];     cout <<  CallFunction("sum",1,2,3,4) << end1; /* How to properly execute "sum" function by sending string name to variadic function template function??? */     CallFunction("strcopy",buffer); /* How to properly execute "strcopy" function by sending string name to variadic function template function??? */     printf("Buffer says = %s" , buffer); /* Should print "Hello World!!!" */     getchar();     return 0; }   

Я получаю сообщение компилятора, как
<Сильная> Ошибка C2197: 'int (__cdecl *) (char *)': слишком много аргументов для maincall
<Код> see reference to class template instantiation 'std::_Result_type<false,_Fty,_V0_t,_V0_t,_V2_t,_V2_t,_V4_t,_V4_t,_V6_t,_V6_t,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>' being compiled

Английский оригинал

Hello what wrong Iam doing here in using variadic templates via string? How to use it properly to achieve the below task?

#include <iostream> #include<string>  int sum(int a, int b, int c, int d) { return a+b+c+d; } int strcopy(char* str)   { strcpy(str,"Hello World!!!"); return 1; }  template<typename Func, typename... Args> auto MainCall(Func func, Args&&... args)-> typename std::result_of<Func(Args...)>::type {     return func(std::forward<Args>(args)...); }  template<typename... funcname, typename... Args> int CallFunction(std::string const& Func , Args&&... args) {      if(!Func.compare("sum"))     {         return MainCall(sum, args...);     }     else if(!Func.compare("strcopy"))     {         return MainCall(strcopy, args...);     }     else     {         return 0;     }  }   int _tmain(int argc, _TCHAR* argv[]) {     char buffer[512];     cout <<  CallFunction("sum",1,2,3,4) << end1; /* How to properly execute "sum" function by sending string name to variadic function template function??? */     CallFunction("strcopy",buffer); /* How to properly execute "strcopy" function by sending string name to variadic function template function??? */     printf("Buffer says = %s" , buffer); /* Should print "Hello World!!!" */     getchar();     return 0; } 

I get compiler error like
error C2197: 'int (__cdecl *)(char *)' : too many arguments for Maincall
see reference to class template instantiation 'std::_Result_type<false,_Fty,_V0_t,_V0_t,_V2_t,_V2_t,_V4_t,_V4_t,_V6_t,_V6_t,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>' being compiled

</div
     
         
         

Список ответов

3
 
vote

Проблема:

Когда вы звоните:

 <код> CallFunction("sum", 1, 2, 3, 4)   

Функция шаблонов <код> CallFunction создается funcanme={} (совершенно бесполезно, вы можете удалить его) и <код> Args={int, int, int, int} . В этой функции у вас есть строка: <код> MainCall(strcopy, args...); , который в этом случае становится: <код> MainCall(strcopy, 1, 2, 3, 4) , который в свою очередь звонит <код> strcopy(1, 2, 3, 4) который неверный вызов.

Нет (не запутанного) способа в C ++, чтобы вызвать функцию с различными прототипами на основе имени, известного во время выполнения, и принимать пакет вариационного аргумента.

 

The problem is:

When you call:

CallFunction("sum", 1, 2, 3, 4) 

The templated function CallFunction is instantiated with funcanme={} (totally useless, you can remove it) and Args={int, int, int, int}. In this function you have a line: MainCall(strcopy, args...); which in this case becomes: MainCall(strcopy, 1, 2, 3, 4) which in turn calls strcopy(1, 2, 3, 4) which is invalid call.

There is no (non-convoluted) way in C++ to call function with different prototypes based on a name known at runtime and taking a variadic argument pack.

</div
 
 
   
   

Связанный проблема

0  Как получить несколько наборов результатов с Poco :: Data?  ( How to fetch multiple result sets with pocodata ) 
Я прочитал Poco :: Руководство пользователя данных и упоминается, что Библиотека имеет поддержку нескольких наборов результатов. Существует пример для этой ...

0  Использование аргументов Makefile без Foo =  ( Using makefile arguments without foo ) 
У меня есть makefile, который я использую для компиляции одного файла. Когда мне нужно пройти аргумент, я использую цель = TargetFile. Сценарий принимает ар...

57  Как сделать макрос C ++ вести себя как функция?  ( How do i make a c macro behave like a function ) 
Допустим, по какой-то причине вам нужно написать макрос: <код> MACRO(X,Y) . (давайте предположим, что есть веская причина, по которой вы не можете использова...

0  Libusb_Bulk_Transfer добавляет CRC?  ( Does libusb bulk transfer add crc ) 
Я пишу программу пользовательского интерфейса для устройства USB в C ++, используя Visual Studio 2019. Я использую библиотеку Libusb. Я хочу сделать объемную ...

0  Как настроить VS2008 для эффективного развития C ++  ( How to setup vs2008 for efficient c development ) 
Обычно I Программируйте в C #, но были вынуждены выполнять работу в C ++. Похоже, что интеграция с Visual Studio (2008) действительно плохо по сравнению с C #...

0  Проблема дизайна - создание шрифта Global (C ++, Marmalade)  ( Design issue making a font global c marmalade ) 
У меня есть проект Marmalade C ++, где встроенный в шрифте не масштабируется на экран. Чтобы справиться с этим вопросом, я делаю пользовательский шрифт, котор...

1  Почему 64-битное целое расширение C ++ называется «долгим долгом»?  ( Why is the 64bit integer extension of c called long long ) 
В отличие от других типов: «int», "логический", "двойной" и т. Д. И даже таможенные классы, есть только одно слово. Однако только одно слово для их типа тольк...

2  Новый DataType, который может иметь количество до 100 цифр  ( New datatype which can have numbers upto 100 digits ) 
Примечание. Это был вопрос интервью и может не иметь фактического случая использования в настоящее время Вопрос должен был разработать класс, который может ...

4  Преобразовать фильм в Openni * .oni видео  ( Convert movie to openni oni video ) 
the библиотека Kinect Openni использует пользовательский формат видеофайла для хранения видеороликов, которые содержат информацию RGB + D. Эти видео имеют р...

0  Ошибка: аргумент типа "void (opca_hello ::) ()" не соответствует "void * (*) (void *)"  ( Error argument of type void opca hello does not match void void ) 
Я написал очень простой код для резьбы. Поскольку я очень новый для этого, я понятия не имею об ошибке. <код> class opca_hello { public: void hello(); } v...

501  Как использовать постоянную PI в C ++  ( How to use the pi constant in c ) 
Я хочу использовать постоянные и тригонометрические функции PI в некоторой программе C ++. Я получаю тригонометрические функции с помощью <код> include <math....

-1  Неожиданный идентификатор ошибки - не уверен, почему (C ++)  ( Unexpected error id not sure why c ) 
IM Реализация программы C ++, по соображениям проекта оно должно быть включено в один файл, поэтому я не могу поставить то, что вы обычно в отдельном файле за...

1  Не можете получить программу Math C ++ для работы [дубликата]  ( Cant get math c program to work ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже есть ответы здесь : ...

5  Что такое "для (x: y)"?  ( What is for x y ) 
Итак, я оглянулся на межпубки о нитках, и я пришел в блог / учебную вещь о нитках, но то, что меня смущено, была эта линия, которую он использовал <код> for...

1  C ++ - утечка памяти, вызванная использованием размещения New Over * этот указатель?  ( C memory leak caused by using placement new over this pointer ) 
Как известно, размещение New просто строит объект без выделения любой памяти. Также все члены в классе <Код> 5.5.10 являются объектами вместо указателей, хот...