Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可用于函数签名的变量typedef_C++_C++11 - Fatal编程技术网

C++ 可用于函数签名的变量typedef

C++ 可用于函数签名的变量typedef,c++,c++11,C++,C++11,基本上,我只想将任何可调用对象及其参数包装在一个任务obj中,以便以后调用。下面是我想到的代码: 假设所有这些可调用类型都有一个成员类型,它们的定义如下: template<typename TReturn, typename...TArgs> struct SomeFunction{ using ArgTypes = TArgs; // won't compile of course } template<typename TFunction> class T

基本上,我只想将任何可调用对象及其参数包装在一个任务obj中,以便以后调用。下面是我想到的代码:

假设所有这些可调用类型都有一个成员类型,它们的定义如下:

template<typename TReturn, typename...TArgs>
struct SomeFunction{
    using ArgTypes = TArgs; // won't compile of course
}
template<typename TFunction>
class Task {
public:
    Task(TFunction fun, typename TFunction::ArgTypes...args) // won't compile
        : fun_(fun), args_(args){}
    void operator()()
    {
        fun_(args_...); // won't compile: workaround 1
    }
private: 
    typename TFunction::ArgTypes... args_; // won't compile: workaround 2
    TFunction fun_;
};
模板
结构函数{
使用ArgTypes=TArgs;//当然不会编译
}
任务模板的定义如下:

template<typename TReturn, typename...TArgs>
struct SomeFunction{
    using ArgTypes = TArgs; // won't compile of course
}
template<typename TFunction>
class Task {
public:
    Task(TFunction fun, typename TFunction::ArgTypes...args) // won't compile
        : fun_(fun), args_(args){}
    void operator()()
    {
        fun_(args_...); // won't compile: workaround 1
    }
private: 
    typename TFunction::ArgTypes... args_; // won't compile: workaround 2
    TFunction fun_;
};
模板
课堂任务{
公众:
Task(TFunction fun,typename TFunction::ArgTypes…args)//无法编译
:fun_(fun),args_(args){}
void运算符()()
{
fun_z(args_……;//将不编译:解决方法1
}
私人:
typename TFunction::ArgTypes…args_;//将不编译:解决方法2
t功能乐趣!;
};
问题在于任务构造函数的定义。有什么办法可以实现吗?当然,我可以将其定义为模板构造函数:

template<typename...TArgs>
Task(TFunction fun, TArgs...args)
模板
任务(t函数乐趣、目标…参数)
但是通过这种方式,编译器将不知道TARG与TFunction::ArgTypes是相同的。因此,当错误的参数传递给它时,错误消息是荒谬的

解决方法1:


解决方法2:

您可以使用
std::tuple
来存储参数,并将其解压缩到call操作符中。如果要以某种方式在函数类型中定义
targets
,则应将其定义为元组:

template<typename TReturn, typename...TArgs>
struct SomeFunction{
    using ArgTypesTuple = std::tuple<TArgs...>;
    //                    ^^^^^^^^^^
}

您可以对某些更改执行哪些操作:

template <typename TReturn, typename...TArgs>
struct SomeFunction{
    using ReturnType = TReturn;
    using ArgTypes = std::tuple<TArgs...>;
};

使用元组来存储参数?您可以使用
元组
。不,我的问题不是元组。这是[解决方法][2]
因此,当错误的参数传递给它时,错误消息是荒谬的。
你是什么意思?@leemes我希望错误消息是不匹配的参数,但实际上它的类型在元组错误之间转换。另一种选择是使用
std::bind
,而不是lambdaNo,而不是std::函数。它无法测试是否相等。为什么需要检查是否相等?你如何定义平等?函数指针和参数?是否要将任务存储在需要相等运算符的容器中?@leemes,因为它们需要从某个容器中添加和/或删除。哪种容器类型?您可以简单地在任务中添加一个
id
,并使用它来定义相等性。可以使用静态计数器分配
id
s,并且机制可以在
Task
内部并完全隐藏。哇!这正是我想要的。这个答案只解决了问题的一部分(简单的部分),但忽略了呼叫接线员的定义,这是困难和丑陋的部分。因此,有一个问题:@leems:
operator()
added(附完整示例)。@leems实际上没那么难。关键部分是
fun(std::get(args)…
。生成
std::size\u T…index
只需要几行代码。是的,但我想知道您现在如何比较不同的
任务
对象(具有不同的参数)以获得所需的相等性。。。