Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.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++ 没有stl和动态内存分配的成员函数类_C++_Function_Templates_Pointers - Fatal编程技术网

C++ 没有stl和动态内存分配的成员函数类

C++ 没有stl和动态内存分配的成员函数类,c++,function,templates,pointers,C++,Function,Templates,Pointers,我编写了下面的示例,它不使用标准库来调用类成员函数。这就像预期的一样,但我想让它更通用。这适用于带有8位微控制器的嵌入式系统。我不想引起讨论,是否使用C++来实现这种架构。 代码的工作原理如下:不可能为类成员函数或函数使用void指针。虽然可以对单个函数使用void指针,但这不是定义良好的行为 在本例中,我使用静态函数调用类成员。方法调用方函数是一个静态模板函数,它接受对象类型和成员函数指针作为模板参数 bind函数将对象指针存储为void指针,并将类内的callingFunction设置为特定

我编写了下面的示例,它不使用标准库来调用类成员函数。这就像预期的一样,但我想让它更通用。这适用于带有8位微控制器的嵌入式系统。我不想引起讨论,是否使用C++来实现这种架构。 代码的工作原理如下:不可能为类成员函数或函数使用void指针。虽然可以对单个函数使用void指针,但这不是定义良好的行为

在本例中,我使用静态函数调用类成员。方法调用方函数是一个静态模板函数,它接受对象类型和成员函数指针作为模板参数

bind函数将对象指针存储为void指针,并将类内的callingFunction设置为特定的静态方法。当调用()运算符时,调用函数指针的是特定对象和所有参数

所有这些都可以像预期的那样工作,并且可以在启用C++11的情况下编译,这是由于可变模板的缘故。我的目的是让api更舒适。一直使用f.bind&t似乎有点长,但我不知道有什么更好的方法可以做到这一点。有什么想法吗

另一点是存储不属于类的函数

#include <iostream>

class testclass {
public:
    virtual char test(void){
        return '.';
    }
};

class testclass2 : public testclass{
public:
    char test(void){
        return '@';
    }
};

template<typename signature>
class Function;

template<typename TReturn, typename ...TParam>
class Function<TReturn(TParam...)> {
public:
    template<typename TObject, TReturn (TObject::*TMethod)(TParam...)>
    void bind(TObject *obj){
        this->obj = obj;
        this->callingFunction = &methodCaller<TObject, TMethod>;
    }

    TReturn operator()(TParam... params){
        return callingFunction(this->obj, params...);
    }
private:
    void *obj;
    TReturn (*callingFunction)(void *obj, TParam...);

    template<typename TObject, TReturn (TObject::*TMethod)(TParam...)>
    static TReturn methodCaller(void *obj, TParam... params) {
        TObject *c = static_cast<TObject*>(obj);
        return (c->*TMethod)(params...);
    }
};

int main(){
    testclass t;

    Function<char(void)> f;
    f.bind<testclass, &testclass::test>(&t);
    std::cout << f();

    testclass2 t1 = testclass2();
    f.bind<testclass, &testclass::test>(&t1);
    std::cout << f();
}
#包括
类testclass{
公众:
虚拟字符测试(void){
返回“.”;
}
};
类testclass2:公共testclass{
公众:
字符测试(无效){
返回“@”;
}
};
模板
类函数;
模板
类函数{
公众:
模板
无效绑定(对象*对象){
本->obj=obj;
此->调用函数=&methodCaller;
}
TReturn运算符()(TParam…参数){
返回调用函数(此->对象,参数…);
}
私人:
void*obj;
t返回(*调用函数)(无效*obj,TParam;
模板
静态TReturn方法调用程序(void*obj,TParam…params){
TObject*c=静态铸件(obj);
返回(c->*t方法)(参数…);
}
};
int main(){
测试类t;
函数f;
f、 绑定(&t);

std::cout以下内容允许您使用预期的接口

template<typename signature> class Function;

template<typename TReturn, typename ...TParam>
class Function<TReturn(TParam...)> {
private:
    template <typename Obj>
    struct Helper
    {
        Obj* obj;
        TReturn (Obj::*m)(TParam...);

        Helper(Obj* obj, TReturn (Obj::*m)(TParam...)) : obj(obj), m(m) {}

        template <typename ... Args>
        TReturn call(Args&&... args) { return (obj->*m)(std::forward<Args>(args)...); }
    };

public:
    template<typename TObject>
    void bind(TObject *obj, TReturn (TObject::*m)(TParam...)){
        this->obj = std::make_shared<Helper<TObject>>(obj, m);
        this->callingFunction = &methodCaller<TObject>;
    }

    TReturn operator()(TParam&&... params){
        return callingFunction(this->obj.get(), std::forward<TParam>(params)...);
    }
private:
    std::shared_ptr<void> obj;
    TReturn (*callingFunction)(void* obj, TParam...);

    template<typename TObject>
    static TReturn methodCaller(void *obj, TParam... params) {
        auto* c = static_cast<Helper<TObject>*>(obj);
        return c->call(std::forward<TParam>(params)...);
    }
};
模板类函数;
模板
类函数{
私人:
模板
结构辅助程序
{
Obj*Obj;
TReturn(目标::*m)(TParam…);
Helper(Obj*Obj,TReturn(Obj::*m)(TParam…):Obj(Obj),m(m){}
模板
TReturn调用(Args&…Args){return(obj->*m)(std::forward)


我允许您用自己的智能指针替换标准库中的
std::shared\ptr

以下内容允许您使用预期的界面

template<typename signature> class Function;

template<typename TReturn, typename ...TParam>
class Function<TReturn(TParam...)> {
private:
    template <typename Obj>
    struct Helper
    {
        Obj* obj;
        TReturn (Obj::*m)(TParam...);

        Helper(Obj* obj, TReturn (Obj::*m)(TParam...)) : obj(obj), m(m) {}

        template <typename ... Args>
        TReturn call(Args&&... args) { return (obj->*m)(std::forward<Args>(args)...); }
    };

public:
    template<typename TObject>
    void bind(TObject *obj, TReturn (TObject::*m)(TParam...)){
        this->obj = std::make_shared<Helper<TObject>>(obj, m);
        this->callingFunction = &methodCaller<TObject>;
    }

    TReturn operator()(TParam&&... params){
        return callingFunction(this->obj.get(), std::forward<TParam>(params)...);
    }
private:
    std::shared_ptr<void> obj;
    TReturn (*callingFunction)(void* obj, TParam...);

    template<typename TObject>
    static TReturn methodCaller(void *obj, TParam... params) {
        auto* c = static_cast<Helper<TObject>*>(obj);
        return c->call(std::forward<TParam>(params)...);
    }
};
模板类函数;
模板
类函数{
私人:
模板
结构辅助程序
{
Obj*Obj;
TReturn(目标::*m)(TParam…);
Helper(Obj*Obj,TReturn(Obj::*m)(TParam…):Obj(Obj),m(m){}
模板
TReturn调用(Args&…Args){return(obj->*m)(std::forward)


我让您用自己的智能指针替换标准库中的
std::shared\u ptr

您希望使用哪个接口?您想要类似
std::bind(&testclass::test,&t/*,_1,_2*/);
更好的接口应该是f.bind(&t,&testclass::test)您希望使用哪种接口?是否希望使用类似于
std::bind(&testclass::test,&t/*,_1,_2*/);
更好的接口应该是f.bind(&t,&testclass::test)没有动态内存分配,也没有使用std::的方法。我使用std::cout仅用于测试输出,但最终代码将在8位处理器上运行。没有动态内存分配,也没有使用std::的方法。我使用std::cout仅用于测试输出,但最终代码将在8位处理器上运行