C++ c++;11

C++ c++;11,c++,c++11,header-only,C++,C++11,Header Only,我试图以结构化的方式(即使用类)表示一些元信息。它只是标题,我需要支持c++11,所以不能使用内联变量。我提出了几个可能的解决方案,但每个都有缺点。任何建议都将不胜感激,尽管仅仅指出如何使“备选方案B”编译对我来说将是一个伟大的解决方案 SthInfo::fieldA用作模板化的Processor::work(field)的参数,其中: 检查“容器类型”是否与此处理器匹配 并将ID与其他不相关的参数一起使用,以执行一些内部逻辑 备选方案A-工作但模板化的ID #包括 模板 类字段信息{ 公众

我试图以结构化的方式(即使用类)表示一些元信息。它只是标题,我需要支持c++11,所以不能使用内联变量。我提出了几个可能的解决方案,但每个都有缺点。任何建议都将不胜感激,尽管仅仅指出如何使“备选方案B”编译对我来说将是一个伟大的解决方案

SthInfo::fieldA
用作模板化的
Processor::work(field)
的参数,其中:

  • 检查“容器类型”是否与此处理器匹配
  • 并将ID与其他不相关的参数一起使用,以执行一些内部逻辑
备选方案A-工作但模板化的ID
#包括
模板
类字段信息{
公众:
静态constexpr int id=id;
};
模板
类处理器{
公众:
模板
无效工作(字段信息字段){
静态_断言(std::is_same::value,“给定字段无法处理-容器类型不匹配”);
//使用ID的某些业务逻辑,即访问'field.ID'`
int id=field.id;
}
};
struct Sth{/*包含fieldA和fieldB-例如*/};
//SthInfo保存有关某事物中字段的元信息
struct SthInfo{
静态constexpr FieldInfo fieldA{};
};
int main(){
处理器;
处理器工作(SthInfo::fieldA);
}
这在Linux和Windows上工作(编译和链接)很好。但是,是否有办法避免模板中的
ID
常量,并将其作为
FieldInfo
类中的字段?还有其他改进意见吗

备选方案B-断开-无法链接 我已尝试更改为以下代码,但它在Linux上没有链接(但在Windows上有链接…),并带有对SthInfo::fieldA的
未定义引用:

#包括
模板
类字段信息{
公众:
const int id;
};
模板
类处理器{
公众:
模板
无效工作(字段信息字段){
静态_断言(std::is_same::value,“给定字段无法处理-容器类型不匹配”);
//使用ID的某些业务逻辑,即访问'field.ID'`
int id=field.id;
}
};
struct Sth{/*包含fieldA和fieldB-例如*/};
//SthInfo保存有关某事物中字段的元信息
struct SthInfo{
静态constexpr FieldInfo fieldA{1};
};
int main(){
处理器;
处理器工作(SthInfo::fieldA);
}
替代C-constexpr函数-不太好用。 将
SthInfo::fieldA
更改为constexpr函数会有所帮助,但在应用程序代码中使用时必须使用
()

#包括
模板
类字段信息{
公众:
const int id;
};
模板
类处理器{
公众:
模板
无效工作(字段信息字段){
静态_断言(std::is_same::value,“给定字段无法处理-容器类型不匹配”);
//使用ID的某些业务逻辑,即访问'field.ID'`
int id=field.id;
}
};
struct Sth{/*包含fieldA和fieldB-例如*/};
//SthInfo保存有关某事物中字段的元信息
struct SthInfo{
静态constexpr FieldInfo fieldA(){return FieldInfo{1};}
};
int main(){
处理器;
processor.work(SthInfo::fieldA());
}

在C++17之前,C++17引入了内联变量并使constexpr静态成员变量隐式内联。如果使用odr,则必须在类外定义此类变量:

const FieldInfo<Sth> SthInfo::fieldA;
const FieldInfo SthInfo::fieldA;
请注意,这是一个非模板变量,因此必须在源文件中定义。模板化变量的类似定义可以出现在标题中(使用与内联变量相同的编译器/链接器支持),因此您需要使用

template<class T>
struct Info {
    static constexpr FieldInfo<T> fieldA{1};
};
template<class T> const FieldInfo<T> Info<T>::fieldA;
模板
结构信息{
静态constexpr FieldInfo fieldA{1};
};
模板常量FieldInfo::fieldA;

所以你只需要改变你对什么是“好”的想法,然后你就有了一个好的工作解决方案,不是吗?问题是什么?@idclev463035818显然这是真的:),但我希望有一个更优雅的解决方案——这就是为什么我要接触社区,然后你需要解释你所谓的“更优雅”。我只是想从你那里挑出一个更具体的问题;)此外,最好包括s。当我看到
时,我总是感到困惑(因为要么是可变模板的问题,要么是不完整的代码)。如果理解问题不需要替换
的内容,可以将其删除。如果有必要,您应该包括itI不能复制“但它在Linux上不链接”的B案例。请提供一个最小的可复制示例。谢谢,不幸的是,这对我来说不起作用,因为这些类是(生成的)仅标题代码的一部分。我已经尝试过了,但即使使用
内联
也无法让它在c++11上运行,因为这只是c++17://@vaind:我没有看到关于更改
SthInfo
类的任何限制实际上,您展示了它的三个不同版本。我是否误解了,或者我只是没有充分强调只能使用页眉的方法?