#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()
.