Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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++ C++;:作为非模板类成员的泛型函数包装类_C++_C++11_Function Pointers_Wrapper_Variadic Templates - Fatal编程技术网

C++ C++;:作为非模板类成员的泛型函数包装类

C++ C++;:作为非模板类成员的泛型函数包装类,c++,c++11,function-pointers,wrapper,variadic-templates,C++,C++11,Function Pointers,Wrapper,Variadic Templates,我正在尝试实现一个卡尔曼滤波器类,它可以接受用户提供的测量模型函数,该函数可以有任意数量的参数。如果你不熟悉卡尔曼滤波器,那没关系,基本上我有一个非模板类,它有一个模板化的构造函数,它接收一个具有任意数量的任意类型参数的函数。然后,构造函数将传递的函数分配给函数包装器成员对象,该对象本身是基于可变模板类构造的。我遇到的问题是,在不知道将传递给构造函数的函数的具体形式的情况下,如何将函数包装器对象声明为Kalman filter类的成员 我道歉,如果这不是很清楚。然而,我基本上一直在遵循问题的答案

我正在尝试实现一个卡尔曼滤波器类,它可以接受用户提供的测量模型函数,该函数可以有任意数量的参数。如果你不熟悉卡尔曼滤波器,那没关系,基本上我有一个非模板类,它有一个模板化的构造函数,它接收一个具有任意数量的任意类型参数的函数。然后,构造函数将传递的函数分配给函数包装器成员对象,该对象本身是基于可变模板类构造的。我遇到的问题是,在不知道将传递给构造函数的函数的具体形式的情况下,如何将函数包装器对象声明为Kalman filter类的成员


我道歉,如果这不是很清楚。然而,我基本上一直在遵循问题的答案,其中行
auto add=make_action([](inta,intb){std::cout不清楚这对您有什么好处,但这使您的示例能够工作:

#include <iostream>
#include <functional>

class KF
{
private:
    std::function<void()> measurementModel;

public:
    template <typename MsFnc, typename... FncArgs>
    KF( MsFnc&& msFnc, FncArgs&&... fncArgs )
        :    measurementModel([=]() { return msFnc(fncArgs...); })
    {}

    void CallMeasMod( void )
    {
        measurementModel();
    }
};

int main( void )
{
    KF kf([](int x, int y){ std::cout << (x+y) << std::endl; }, 3, 4 );
    kf.CallMeasMod();
    return 0;
}
#包括
#包括
KF类
{
私人:
std:功能测量模型;
公众:
模板
KF(MsFnc和MsFnc、FncArgs和…FncArgs)
:measurementModel([=](){返回msFnc(fncArgs…;})
{}
无效CallMeasMod(无效)
{
测量模型();
}
};
内部主(空)
{

KF KF([](int x,int y){std::cout不清楚这对您有什么好处,但这使您的示例能够工作:

#include <iostream>
#include <functional>

class KF
{
private:
    std::function<void()> measurementModel;

public:
    template <typename MsFnc, typename... FncArgs>
    KF( MsFnc&& msFnc, FncArgs&&... fncArgs )
        :    measurementModel([=]() { return msFnc(fncArgs...); })
    {}

    void CallMeasMod( void )
    {
        measurementModel();
    }
};

int main( void )
{
    KF kf([](int x, int y){ std::cout << (x+y) << std::endl; }, 3, 4 );
    kf.CallMeasMod();
    return 0;
}
#包括
#包括
KF类
{
私人:
std:功能测量模型;
公众:
模板
KF(MsFnc和MsFnc、FncArgs和…FncArgs)
:measurementModel([=](){返回msFnc(fncArgs…;})
{}
无效CallMeasMod(无效)
{
测量模型();
}
};
内部主(空)
{

KF KF([](int x,int y){std::cout度量模型函数的参数类型是什么?它们应该是模板类型吗?它们都是相同的类型吗?你的构造函数接受一个包含N个参数的函数,还有N个随它而来的参数。你为什么不直接用这些参数调用它,然后存储(单数)呢返回值?如果只是延迟调用,您会遇到很多麻烦。度量模型函数的参数类型是什么?它们应该是模板类型吗?它们都是相同的类型吗?您的构造函数接受一个包含N个参数的函数,以及N个随它而来的参数。为什么不立即使用这些参数调用它呢,并存储(单数)返回值?您会遇到很多麻烦,只是为了延迟该调用。奇怪的是,这在使用Clang(如演示中所使用的)时效果很好,但不使用g++。不使用g++4.8.4和
-std=c++11
-std=c++1y
。我认为它需要c++14,但4.8.4中的c++1y只提供了对c++14的实验性支持。实际上,它与c++14没有任何关系。结果是g++4.8.4只是有一个bug。我不得不咬紧牙关,用极其缓慢的速度升级g++互联网连接,这花费了相当长的时间。你的答案现在可以很好地工作,正是我想要的,而且简单得多。谢谢你。奇怪的是,这可以很好地使用Clang(如演示中使用的),但不使用g++。不使用g++4.8.4和
-std=c++11
-std=c++1y
。我认为它需要c++14,但4.8.4中的c++1y只提供了对c++14的实验性支持。实际上,它与c++14没有任何关系。结果是g++4.8.4只是有一个bug。我不得不咬紧牙关,用极其缓慢的速度升级g++互联网连接,这花费了相当长的时间。你的答案现在很完美,正是我想要的,而且简单得多。谢谢。