带有 setter 的 C++ 类,它接受一个输入指针,稍后将值返回给该指针

标签 c++ dictionary casting key-value getter-setter

我尝试了四种不同的方法来让它发挥作用。我想在调用“get_all”时分配变量以捕获接口(interface)输入。


1 - 由于我对模板缺乏理解而失败

#include <iostream>
#include <string>
#include <map>
using namespace std;
#include <boost/lexical_cast.hpp>

class interface {
    template <typename t> struct val_t{ t val; t& out; };

    map<string, val_t> KeyDict;

    template <typename t> void add(t& out, string key, t value) {
        KeyDict[key] ={ value, out };
    }

    template <typename t> void get_all() {
        for (auto i = KeyDict.begin(); i != KeyDict.end(); ++i) {
            i->second().out = boost::lexical_cast<t>(i.second().val);
        }
    }
};

int main() {
    int i;
    double d;
    string s;
    bool b;

    interface ui;

    ui.add(i, "my int", 1); // if it's not possible do to 1 here, I could do "1";
    ui.add(d, "my double", 3.14);
    ui.add(s, "my string", "good stuff");
    ui.add(b, "my bool", false);

    ui.get_all();

    cout <<
        "int = " << i << endl <<
        "double = " << d << endl <<
        "string = " << s << endl <<
        "bool = " << b << endl;
}

2 - 由于某些原因 add() 不喜欢字符串

#include <iostream>
#include <string>
#include <map>
#include <boost/any.hpp>

using namespace std;

class interface {
public:

    struct any { boost::any out; boost::any val; };
    map<string, any> KeyDict;

    template <typename t> void add(t& out, string key, t defval) { KeyDict[key].out = defval; KeyDict[key].val = defval; }

    void get_all() {
        for (auto i = KeyDict.begin(); i != KeyDict.end(); ++i) 
            i->second.out = i->second.val;
    }
};

int main() {
    int i = 0;
    double d = 0;
    string s = "";
    bool b = 0;

    interface ui;

    ui.add(i, "my int", 1); // if it's not possible do to 1 here, I could do "1";
    ui.add(d, "my double", 3.14);
    ui.add(s, "my string", "good stuff");
    ui.add(b, "my bool", false);

    ui.get_all();

    cout <<
        "int = " << i << endl <<
        "double = " << d << endl <<
        "string = " << s << endl <<
        "bool = " << b << endl;

    cin.get();
}

3 - 错误:试图引用已删除的函数

#include <iostream>
#include <string>
#include <map>

using namespace std;

class interface {
public:
    struct typer {
        int& i_out;
        double& d_out;
        bool& b_out;
        string& s_out;

        int i = 0;
        double d = 0;
        bool b = 0;
        string s;
        char t = 0;
    };

    map<string, typer> KeyDict_i;
    map<string, typer> KeyDict_d;
    map<string, typer> KeyDict_b;
    map<string, typer> KeyDict_s;

    void add(int& out, string key, int val) { KeyDict_i[key].i_out = out; KeyDict_i[key].i = val; KeyDict_i[key].t = 'i'; }
    void add(double& out, string key, double val) { KeyDict_d[key].d_out = out; KeyDict_d[key].d = val; KeyDict_d[key].t = 'd'; }
    void add(bool& out, string key, bool val) { KeyDict_b[key].b_out = out; KeyDict_b[key].b = val; KeyDict_b[key].t = 'b'; }
    void add(string& out, string key, string val) { KeyDict_s[key].s_out = out; KeyDict_s[key].s = val; KeyDict_s[key].t = 's'; }

    void get_all() {
        for (auto i = KeyDict_i.begin(); i != KeyDict_i.end(); ++i) i->second.i_out = i->second.i;
        for (auto i = KeyDict_d.begin(); i != KeyDict_d.end(); ++i) i->second.d_out = i->second.d;
        for (auto i = KeyDict_b.begin(); i != KeyDict_b.end(); ++i) i->second.b_out = i->second.b;
        for (auto i = KeyDict_s.begin(); i != KeyDict_s.end(); ++i) i->second.s_out = i->second.s;
    }
};

int main() {
    int i = 0;
    double d = 0;
    string s = "";
    bool b = 0;

    interface ui;

    ui.add(i, "my int", 1); // if it's not possible do to 1 here, I could do "1";
    ui.add(d, "my double", 3.14);
    ui.add(s, "my string", "good stuff");
    ui.add(b, "my bool", false);

    ui.get_all();

    cout <<
        "int = " << i << endl <<
        "double = " << d << endl <<
        "string = " << s << endl <<
        "bool = " << b << endl;
}

#3 是最直接的,因为我没有使用任何提升或模板。也许这将是最容易利用我已有的东西开始工作的方法?

最佳答案

这行得通。谢谢你的建议,πìνταῥεῖ。这个答案是第一次和第三次尝试的结合。

运行:http://cpp.sh/3j5mp

#include <iostream>
#include <string>
#include <map>   

using namespace std;

class interface {
public:
    void add(int* out, string key, int val) { ui_i.sub_add(out, key, val); }
    void add(bool* out, string key, bool val) { ui_b.sub_add(out, key, val); }
    void add(double* out, string key, double val) { ui_d.sub_add(out, key, val); }
    void add(string* out, string key, string val) { ui_s.sub_add(out, key, val); }

    void get_all() {
        ui_i.sub_get_all();
        ui_b.sub_get_all();
        ui_s.sub_get_all();
        ui_d.sub_get_all();
    }
private:
    template <typename t> class value_dict {
    public:
        struct key_t { 
            t val;
            t* out; 
        };

        map<string, key_t> KeyDict;

        void sub_add(t *out, string key, t value) {
            KeyDict[key] ={ value, out };
        }

        void sub_get_all() {
            for (auto i = KeyDict.begin(); i != KeyDict.end(); ++i) {
                *i->second.out = i->second.val;
            }
        }
    };
    value_dict<int> ui_i;
    value_dict<bool> ui_b;
    value_dict<string> ui_s;
    value_dict<double> ui_d;
};

int main() {
    int i;
    double d;
    string s;
    bool b;

    interface ui;

    ui.add(&i, "my int", 1); // if it's not possible do to 1 here, I could do "1";
    ui.add(&d, "my double", 3.14);
    ui.add(&s, "my string", "good stuff");
    ui.add(&b, "my bool", false);

    ui.get_all();

    cout <<
        "int = " << i << endl <<
        "double = " << d << endl <<
        "string = " << s << endl <<
        "bool = " << b << endl;

    cin.get();
}

关于带有 setter 的 C++ 类,它接受一个输入指针,稍后将值返回给该指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33973746/

相关文章:

c++ - 如果我返回文字而不是声明的 std::string 会怎样?

c++ - 在 C++ 中将字符串拆分为两个分隔符

c# - 如何解决 IReadOnlyDictionary 缺乏协方差的问题?

swift - 如何检索 firebase 数据库值来计算平均值

datetime - 一个更好的 VB6 CDate

c++ - 检查类是否具有给定签名的成员函数

arrays - 在 Swift 5.1 中,在不知道键的情况下,根据 Date 类型的字典值对字典数组进行排序?

qt - 如何将 QChar 转换为 int

c++ - 使用 dynamic_cast : what happenes to the allocated memory 强制转换后删除指针

C++ 动态分配 header