代码之家  ›  专栏  ›  技术社区  ›  manuel

现代C中空指针的替代方案++

  •  0
  • manuel  · 技术社区  · 7 月前

    我想从一个源中检索数据,通过一组不同的函数通过一个函数提供。我来自c,所以我有这个例子:

    #include <iostream>
    
    using namespace std;
    
    void getInt(void *v, const double &src) {*static_cast<int*>(v) = src; }
    void getDouble(void *v, const double &src) {*static_cast<double*>(v) = src; }
    
    struct twoInt{int a; int b;};
    void getTwoInt(void *v, const double &src)
    {
        static_cast<twoInt*>(v)->a = src;
        static_cast<twoInt*>(v)->b = static_cast<int>(src*10) % 10;
    }
    
    template <typename T>
    void getData(T f, void* val)
    {
        double dataSource = 2.1;
        f(val, dataSource);
    }
    
    
    int main()
    {
        int valI;
        double valD;
        twoInt valTwoInt;
    
        getData(getInt, static_cast<void*>(&valI));
        cout << "Int: " << valI << endl;
    
        getData(getDouble, static_cast<void*>(&valD));
        cout << "Double: " << valD << endl;
    
        getData(getTwoInt, static_cast<void*>(&valTwoInt));
        cout << "Int1: " << valTwoInt.a << ", Int2: " << valTwoInt.b <<endl;
    }
    

    但我想用一种现代的C++方式来做,没有空指针,以获得更多的类型安全性。

    1 回复  |  直到 7 月前
        1
  •  1
  •   Jarod42    7 月前

    你不需要在这里删除类型,所以正确的类型和模板可以完成这项工作:

    void getInt(int& out, double src) { out = src; }
    void getDouble(double& out, double src) { out = src; }
    
    struct twoInt{int a; int b;};
    void getTwoInt(twoInt& v, double src)
    {
        v.a = src;
        v.b = static_cast<int>(src * 10) % 10;
    }
    
    template <typename F, typename T>
    void getData(F f, T& val)
    {
        double dataSource = 2.1;
        f(val, dataSource);
    }
    
    int main()
    {
        int valI;
        getData(getInt, valI);
        std::cout << "Int: " << valI << std::endl;
    
        double valD;
        getData(getDouble, valD);
        std::cout << "Double: " << valD << std::endl;
    
        twoInt valTwoInt;
        getData(getTwoInt, valTwoInt);
        std::cout << "Int1: " << valTwoInt.a << ", Int2: " << valTwoInt.b <<std::endl;
    }
    

    Demo

    推荐文章