C++ 如何使用C+中的某个语句初始化类常量静态结构+;

C++ 如何使用C+中的某个语句初始化类常量静态结构+;,c++,stl,C++,Stl,有一个属于类的常量静态std::map。是否有一种形式可以形成以下代码: // file A.h class A { public: const static std::map<std::string, int> m_name2code; public: static int getCode(std::string name); private: const static char *name[3];

有一个属于类的常量静态std::map。是否有一种形式可以形成以下代码:

// file A.h
class A {
   public:
           const static std::map<std::string, int> m_name2code;
   public:
           static int getCode(std::string name);
   private:
           const static char *name[3];
}

// file A.cpp
const char * A::name = {
            "hello", "the", "world" }
for (int index = 0; index < 3; ++index) {
        m_name2code.insert(std::string(name[i]), i+1);
}
//文件A.h
甲级{
公众:
const static std::map m_name2code;
公众:
静态int getCode(std::string name);
私人:
常量静态字符*名称[3];
}
//文件A.cpp
常量字符*A::名称={
“你好”,“世界”}
对于(int-index=0;index<3;++index){
m_name2code.insert(std::string(name[i]),i+1);
}
正如上面的代码一样,我想知道是否有一些语法可以使用control语句初始化类const静态成员


非常感谢…

您将初始化分为两个阶段:

  • 在函数中构建映射并返回结果
  • 根据函数结果初始化
    静态
    变量
  • 例如:

    namespace {
        std::map<std::string, int> build_map() {
            std::map<std::string, int> rc;
            const char * A::name = { "hello", "the", "world" };
            for (int index = 0; index < 3; ++index) {
                rc.emplace(std::string(name[index]), index+1);
            }
            return rc;
        }
    }
    std::map<std::string, int> const A::m_name2code = build_map();
    
    名称空间{
    std::map build_map(){
    std::map-rc;
    const char*A::name={“你好”,“世界”,“世界”};
    对于(int-index=0;index<3;++index){
    rc.emplace(std::string(name[index]),index+1);
    }
    返回rc;
    }
    }
    std::map const A::m_name2code=build_map();
    

    如果您想更进一步,您甚至可以在编译时使用
    constexpr
    (例如,请参阅我的2016演示文稿:)初始化映射(虽然不是
    std::map
    )。

    您想实现什么?控制声明基于什么?你不能既有蛋糕又吃它。静态映射是
    const
    ,因此必须在定义它的地方初始化,或者它是非
    const
    ,以便可以在后续代码语句中初始化。这两者在很大程度上是相互排斥的。如果你必须有一个
    公共的
    地图(顺便说一句,这让我觉得是一个令人震惊的设计决定)将其设置为
    const
    引用,该引用引用了
    private static
    但非
    const
    成员-然后在需要时初始化该私有成员。@Peter:请参阅我关于如何在没有引用的情况下初始化
    const
    数据结构的答案。使用初始值设定项列表,也可以直接初始化映射。当然,一旦初始化,它就变得不可更改。非常感谢,您完美地解决了我的问题。