c++ - std::map 的多态成员变量指针

标签 c++ dictionary function-pointers pointer-to-member member-variables

我正在努力实现与字符串键关联的成员变量指针的映射。 所有变量的范围都来自基类“BaseA” 从映射中访问变量时,只需要使用基类方法(示例中的getDesc()),无需检索原始类型。

此代码在 GNU g++6.2.1 下编译和运行,但根据我的阅读,reinterpret_cast 的使用不可移植,可能不适用于其他编译器。 它是否正确?或者这段代码是否符合C++标准? 有没有其他方法可以不使用 reinterpret_cast 来做到这一点? 一项要求是“Vars”必须可以使用默认的复制构造函数和复制分配实现进行复制。

示例代码:

#include <iostream>
#include <sstream>
#include <map>
#include <typeinfo>

using namespace std;

struct BaseA
{
    virtual string getDesc()  = 0;
};

struct A1 : BaseA
{
    string getDesc() override { return "This is A1"; }
};

struct A2 : BaseA
{
    string getDesc() override { return "This is A2"; }
};

struct Vars
{
    A1 a1;
    A2 a2;

    map< string, BaseA Vars::* > vars;

    Vars()
    {
        vars["A1_KEY"] = reinterpret_cast<BaseA Vars::*>(&Vars::a1);
        vars["A2_KEY"] = reinterpret_cast<BaseA Vars::*>(&Vars::a2);
    }

    BaseA& get( const string& key )
    {
        auto it = vars.find( key );
        if ( it != vars.end())
        {
            return this->*(it->second);
        }
        throw std::out_of_range( "Invalid variable key:[" + key + "]");
    }
};                                

int main()
{
    Vars v;

    cout << "a1 description :" << v.get("A1_KEY").getDesc() << endl;
    cout << "a2 description :" << v.get("A2_KEY").getDesc() << endl;

    return 0;
}

最佳答案

是的,有very few guarantees关于 reinterpret_cast 会做什么,从一个指向成员的指针转换为另一个不是其中之一(除非您随后转换回原始类型,这对您没有真正帮助)。

执行此操作的安全且简单的方法是使用 std::function:

struct Vars
{
    A1 a1;
    A2 a2;

    map< string, std::function<BaseA&(Vars&)> > vars;

    Vars()
    {
        vars["A1_KEY"] = &Vars::a1;
        vars["A2_KEY"] = &Vars::a2;
    }

    BaseA& get( const string& key )
    {
        auto it = vars.find( key );
        if ( it != vars.end())
        {
            return it->second(*this);
        }
        throw std::out_of_range( "Invalid variable key:[" + key + "]");
    }
};

请注意,如果您永远不需要更改 vars 字典,您可以将它变成一个 static const 成员。 (这意味着您需要在源文件中的类之外定义和初始化它。)

关于c++ - std::map 的多态成员变量指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46415283/

相关文章:

c++ - 嵌套函数的线程安全和唯一执行

PYTHON/NUMPY : How to assign various data types to the data type object numpy. dtype() 在循环中

typescript - 映射类型化对象的问题 |无法调用类型缺少调用签名的表达式

c++ - 避免非类类型的指向成员函数的指针

c++ - 在 C++ 中如何传递函数指针并在函数中进行比较?

python - 在 C++ 中创建对象并将指针传递给 python

c++ - boost::extension.hpp的原因未为无序容器和其他一些容器定义hash_value()

c++ - Qt QObject 和 boost::enable_shared_from_this

c# - 使用 JSON 解析 C# 字典

c++ - 模板和函数指针 : How do I define a function-pointer that was declared in a template class?