Как мне определить шаблон класса со специальным форматом приема аргументов шаблона? например: Fn(аргументы …)

#c #class #templates

#c #класс #шаблоны

Вопрос:

 template<class Fn, class ...Args>
class func_class<Fn(Args...)> // Do not know what to do here
{
        typedef typename result_of<Fn(Args...)>::type mytype;
        std::function<mytype(Args...)> func_;
        std::tuple<Args...> tuple1;
    public:
        func_class(Fnamp;amp; func_in, Argsamp;amp; ...args) 
        {
            func_ = func_in;
            tuple1 = make_tuple(args...);
        }
    
        mytype
        exe () 
        {
            mytype ret;
            ret = apply(func_, tuple1);
            return ret;
        }
};

int func(int a) {return a;}

int main () {
   // return type of "func" can be deduced by "result_of<decltype(func)amp;(int)>::type"
   // And result_of is declared as "result_of<Fn(Args...)>"
   // Want func_class to have the same interface
   func_class<decltype(func)amp;(int)> fc; // Want to declare a object like this 
   fc.exe();
}
 

Код похож на приведенный выше. Возвращаемый тип func может быть выведен с помощью result_of<decltype(func)amp;(int)>::type . И result_of объявляется как result_of<Fn(Args...)> .
Хотите func_class иметь тот же интерфейс, result_of что и .
Компилятор жалуется, как:

 test.cpp:211:7: error: 'func_class' is not a class template
 

Что я могу сделать?
Заранее благодарю.

Ответ №1:

 template<class Sig>
struct bob;
template<class R, class...Args>
struct bob<R(Args...)>{
  //...
};
 

специализация.

Использование bob этого не соответствует шаблону, что приведет к ошибкам во время компиляции.

В качестве примечания, использование R(Args...) синтаксиса, когда R не является возвращаемым значением и Args... не является аргументом, приведет к неожиданным сложностям из-за того, как типы аргументов функции и возвращаемых значений изменяются языком C / C .

Вот почему std::result_of<F(Args...)> он устарел и заменен на std::invoke_result<F, Args...> .

R(Args...) уместно используется в std::function , потому Args... что являются аргументами функции, и R является фактическим возвращаемым значением, для function<A(Args...)>::operator() .