gpt4 book ai didi

c++ - 用于将静态字符串常量与类型相关联的类型特征模式

转载 作者:太空宇宙 更新时间:2023-11-04 12:07:45 25 4
gpt4 key购买 nike

我写了一个简单的 traits 类,用于将字符串标识符关联到指定的类型,它的用法如下:

typedef someclass<double,44> someD;
template<> inline const char*
nametrait<someD>::name() {return "some_other_double";}

然后我可以静态和类型安全地做std::cout << someD::name()<

然后我得到 some_other_double .这是用来包旧的具有整数键的类似数据库的结构,以提高类型安全性处理,其中每个字段由它们自己的类型表示,并且 some_other_double表示数据库中的字段名。

这工作正常,当没有时我也会得到一个合理的编译错误名称已设置(在末尾找到我的完整代码)。但是,我想知道是否有一些更好的模式来达到同样的效果。我会定义很多像这样的对象,而我真正想要的是更像的东西

typedef someclass<double,44,"some_other_double"> someD;

但是不允许像这样使用乱码字符串常量(我认为即使在 c++11 中也不行)。如果我一个人在处理这段代码,我可能会使用宏,但我不太热衷于捍卫它

#define namedtype(ss,tt,id,nn,newname)\
typedef ss<tt,id> newname; \
template<> inline const char* nametrait<newname>::name() {return nn;}

我还尝试指定静态名称常量,如下所示: template<>
const char * someclass<double,44>::name = "some_other_double";

但我认为不可能确保它们一次又一次地定义只有一次没有比上面更多的文字(我需要强制每个在某些 cpp 文件中声明的模板实例化)。在链接错误之前,我更喜欢编译时错误。

这是我的代码:

// file: mytypes.h (I omit the include guard)

// this is the default which generates an error message on looking up
// MISSING_DEFINITION_OF_name
template <typename T>
class nametrait
{
public:
static inline const char* name() {return T::MISSING_DEFINITION_OF_name();};
};

template <typename T,int identifier>
class someclass {
private:
someclass(){};
public:
static const char * name() {return nametrait<someclass>::name() ;};
};

typedef someclass<double,44> someD;
template<> inline const char* nametrait<someD>::name() {return "some other double";}

typedef someclass<int,55> someI;
template<> inline const char* nametrait<someI>::name() {return "some specific int";}

typedef someclass<char,22> someC;
template<> inline const char* nametrait<someC>::name() {return "some specific char";}

typedef someclass<char,5> someC;
template<> inline const char* nametrait<someC>::name() {return "some other char";}

使用:

// file:: main.cpp
#include mytypes.h
int main(){
std::cout << someI::name()<<std::endl;
std::cout << someD::name()<<std::endl;
std::cout << someC::name()<<std::endl;
std::cout << someC2::name()<<std::endl;
}

问题:

  1. 有没有人有更好的解决方案?
  2. 我的理解是否正确,与静态字符串常量相比,内联模板方法返回字符串通常不会产生任何额外成本? (例如,将 gcc 与 -g -O 一起使用,这实际上并不意味着 -fno-inline)。

最佳答案

我不确定它是否更好,但这个稍微短一些:

template <typename T,int identifier>
class someclass {
private:
someclass(){};
public:
static inline const char * name();
};


typedef someclass<double,44> someD;

template <> inline const char * someD::name() {return "some other double"; }

关于c++ - 用于将静态字符串常量与类型相关联的类型特征模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11286321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com