Boost 预处理器库,用于基于 C++/CLI 中的基本类型列表(例如 PointI32、PointF32 等)生成一组类型
我试图弄清楚如何使用 Boost.Preprocessor 库 http:// www.boost.org/doc/libs/release/libs/preprocessor 为不同的特定类型展开“通用”类型。下面我就问这个简单的点类例子。给定:
struct Point##TYPE_SUFFIX_NAME
{
TYPE X;
TYPE Y;
// Other code
};
我想为不同的基本(POD)数据类型生成此类型,例如:
PointF32, PointF64, PointI32 etc.
PointF32 的位置:
struct PointF32
{
float X;
float Y;
};
也就是说,基于类型列表:
short, int, long, float, double etc.
我想为这些“展开”上述类型。最好将“模板”定义放在单独的包含文件中,而不是作为宏,以方便调试。
注意:我对 C++ 模板不感兴趣。我知道如何使用模板。但这些对我来说没有用。例如,假设这些类型将在 C# 中从 .NET 使用,但在 C++/CLI 中生成。所以请坚持问题。
当然,问题源于 .NET 中缺乏模板支持以及泛型不适合解决我的问题。
I am trying to figure out how to use the Boost.Preprocessor library http://www.boost.org/doc/libs/release/libs/preprocessor to unfold a "generic" type for different specific types. Below I will ask this for a simple point class example. Given:
struct Point##TYPE_SUFFIX_NAME
{
TYPE X;
TYPE Y;
// Other code
};
I want to generate this type for different basic (POD) data types e.g.:
PointF32, PointF64, PointI32 etc.
where PointF32 would be:
struct PointF32
{
float X;
float Y;
};
That is, based on a list of types:
short, int, long, float, double etc.
I want to "unfold" the above type for these. Preferably with the "template" definition in a separate include file and not as a macro, to allow for easier debugging.
NOTE: I am not interested in hearing about C++ templates. I know how to use templates. But these are not useful in my case. As an example imagine these types are going be used from .NET in C#, but are being generated in C++/CLI. So please stick to the question.
The problem, of course, stems from the lack of template support in .NET and due to generics not being suitable to solve my problem.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
根据 Benoît 的回答,我得出了以下答案。答案由三个文件组成:
MyPointTypes.h
MyPointTypeImpl.h
MyPointTypes.cpp
MyPointTypes.h:
MyPointTypeImpl.h:
MyPointTypes.cpp:
This将定义类型:
想象一下,然后用 C++/CLI 值类型代替 C++ 结构,即:
然后我们有效地创建了所有基本数字类型的点类型,以便在 .NET(例如 C#)中使用。
Based on the answer by Benoît I have come up with the following answer. The answer consists of three files:
MyPointTypes.h
MyPointTypeImpl.h
MyPointTypes.cpp
MyPointTypes.h:
MyPointTypeImpl.h:
MyPointTypes.cpp:
This will define the types:
Imagine then instead of a C++ struct a C++/CLI value type i.e.:
Then we have effectively created point types of all basic numeric types for use in .NET e.g. C#.
旧(模板前)版本的 C++ 编译器通常具有用于此类内容的
标头。我会搜索旧版本的 g++ 来查找它。这是我的时代之前的,所以我不知道它是否适合你。或者,类似的东西
也可以帮助你。
或者显然是一个外部代码生成器(awk、perl、C++ 等)。这可能是最好的解决方案。
Old (pre-template) versions of C++ compilers had often a
<generic.h>
headers for such kind of thing. I'd search old versions of g++ for it. It was before my time, so I don't know if it would suit you or not.Alternatively, something like
could also help you.
Or obviously an external code generator (in awk, perl, C++, whatever). That could be the best solution.
以下代码未经测试,但应该是实现您想要的结果的良好开端。
在 my_structs.h 中:
和在 create_my_structs.h 中
The following code is untested but should be a good start to make what you want happen.
In my_structures.h :
and in create_my_structures.h
这似乎是一个老问题但是......
更容易做到这一点
我认为仅使用标准宏处理器(CPP)或者这种变体(遵循“规范”)
This seems an old question but....
I think is easier to do it just with the standard macroprocessor (CPP)
Or maybe this variation (to follow the 'specifications')