在我的史诗般的探索中,让C++做的事情不应该,我试图把编译时生成的类放在一起.
基于预处理器定义,例如(粗略概念)
CLASS_BEGIN(Name)
RECORD(xyz)
RECORD(abc)
RECORD_GROUP(GroupName)
RECORD_GROUP_RECORD(foo)
RECORD_GROUP_RECORD(bar)
END_RECORDGROUP
END_CLASS
Run Code Online (Sandbox Code Playgroud)
虽然我很确定我生成了一个使用这种结构从文件系统读取数据的类(甚至可能使用模板元编程实现),但我看不出如何生成访问数据的函数和功能来读取数据.
我想最终得到类似这样的课程
class Name{
public:
xyz_type getxyz();
void setxyz(xyz_type v);
//etc
list<group_type> getGroupName();
//etc
void readData(filesystem){
//read xyz
//read abc
//etc
}
};
Run Code Online (Sandbox Code Playgroud)
有没有人知道这是否可能?
- 编辑 -
澄清此用途的用途.我有我想要阅读的标准格式的文件.格式已经定义,因此无法更改.每个文件可以包含任何数字记录,每个记录可以包含任意数量的子记录.
众多记录类型各自包含一组不同的子记录,但它们可以被定义.因此,例如Heightmap记录必须包含Heightmap,但可选包含法线.
所以我想像这样定义一个Record:
CLASS_BEGIN(Heightmap)
RECORD(VHDT, Heightmap, std::string) //Subrecord Name, Readable Name, Type
RECORD_OPTIONAL(VNML, Normals, std::string)
END_CLASS
Run Code Online (Sandbox Code Playgroud)
我想要输出具有类的功能的东西:
class Heightmap{
public:
std::string getHeightmap(){
return mHeightmap->get<std::string>();
}
void setHeightmap(std::string v){
mHeight->set<std::string>(v);
}
bool hasNormal(){
return mNormal != 0;
}
//getter and setter functions for normals …Run Code Online (Sandbox Code Playgroud) 我正在使用一个使用一些非常难看的约定的现有数据库.我想使用NHibernate,我想我可以使用Fluent NHibernate的自动映射约定修复所有这些丑陋的数据库约定.我想避免手工编写所有实体类.(这是LINQ to SQL和SubSonic的吸引力)
是否可以根据我的数据库模式和Fluent NHibernate中指定的映射生成我的C#实体?
旁白:你知道NHibernate的设计师吗?
有没有人有使用继承减少模板代码膨胀的经验?
我犹豫以这种方式重写我们的容器:
class vectorBase
{
public:
int size();
void clear();
int m_size;
void *m_rawData;
//....
};
template< typename T >
class vector : public vectorBase
{
void push_back( const T& );
//...
};
Run Code Online (Sandbox Code Playgroud)
我应该保持最大的性能,同时减少编译时间
我也想知道为什么stl实现不使用这种方法
感谢您的反馈
之前我投入了大量的时间研究剃刀和其适用性,我想问一下你剃刀大师,如果能使用剃刀生成C#代码?您可以立即想到的任何问题?
我正在使用XSD在C#中定义我的DTO类型.我正在使用XSD.exe来生成XSD的类.
我有一个定义地址类型的Common.xsd,我想在多个类中使用它:
<xs:complexType name="Address">
<xs:sequence>
<xs:element name="Street1" type="xs:string"/>
<xs:element name="Street2" type="xs:string"/>
<xs:element name="City" type="xs:string"/>
<xs:element name="State" type="xs:string"/>
<xs:element name="Zip" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="Address" type="mhm:Address"/>
Run Code Online (Sandbox Code Playgroud)
我在XSD公司中引用它:
<xs:include schemaLocation=".\Common.xsd"/>
<xs:complexType name="Company">
<xs:sequence>
<xs:element name="AdmCode" type="xs:string"/>
<xs:element name="CompanyCode" type="xs:string"/>
<xs:element name="Name" type="xs:string"/>
<xs:element ref="mhm:Address"/>
</xs:sequence>
</xs:complexType>
<xs:element name="Company" type="mhm:Company"/>
Run Code Online (Sandbox Code Playgroud)
员工XSD:
<xs:include schemaLocation=".\Common.xsd"/>
<xs:complexType name="Employee">
<xs:sequence>
<xs:element name="EmployeeNumber" type="xs:int"/>
<xs:element name="FirstName" type="xs:string"/>
<xs:element name="LastName" type="xs:string"/>
<xs:element name="Address" type="mhm:Address"/>
</xs:sequence>
</xs:complexType>
<xs:element name="Employee" type="mhm:Employee"/>
Run Code Online (Sandbox Code Playgroud)
我使用这个命令行生成类:
xsd .\XSD\Common.xsd /c /o:. /n:"DomainModel"
xsd .\XSD\Employee.xsd /c /o:. …Run Code Online (Sandbox Code Playgroud) 我们使用VC6编译器在C++中实现的非常古老的遗留系统.现在我们正在重构代码.我们还切换到了VC9编译器.
我们使用外部专有框架,这也是遗留代码,而不是单元可测试的.为了使我们的代码单元可测试,我们为框架类引入了接口和包装器(提示:请参阅Martin Fowler的"使用遗留代码"):

现在我们依赖于接口.包装器调用框架方法,我们可以愉快地在单元测试中使用模拟.
在这里,我们来解决我们的问题......
框架类包含许多需要包装和模拟的方法.为了实现这一目标,我们的供应商团队编写了一个API,它使用C++宏生成接口,包装器和模拟器实现.
包装头文件的示例:
class PlanWrapper : public IPlan
{
// ...
WRP_DECLARE_DEFAULTS(FrameworkPlan); // macro
WRP_DECLARE_CSTR_ATTR(FrameworkPlanLabel); // macro
// ...
};
Run Code Online (Sandbox Code Playgroud)
宏WRP_DECLARE_CSTR_ATTR的定义如下:
#define WRP_DECLARE_CSTR_ATTR(AttrName) \
virtual bool set##AttrName (LPCTSTR Value_in); \
virtual bool get##AttrName (CString& Value_out); \
virtual bool unset##AttrName (); \
virtual bool isSet##AttrName ()
Run Code Online (Sandbox Code Playgroud)
包装器cpp文件的示例:
#include "StdAfx.h"
using namespace SomeNamespace;
WRP_IMPLEMENT_MODDICOM_DEFAULTS(FrameworkPlan)
WRP_IMPLEMENT_W_CSTR_ATTR (FrameworkPlan,FrameworkType1, FrameworkPlanLabel)
// ...
Run Code Online (Sandbox Code Playgroud)
宏WRP_IMPLEMENT_W_CSTR_ATTR的定义如下:
#define WRP_IMPLEMENT_W_CSTR_ATTR(ClassName,AtrTypeObj,AttrName) \
bool ClassName##Wrapper::set##AttrName (LPCTSTR Value_in) { \
AtrTypeObj aValue = Value_in; \
FrameworkLink<ClassName> convertedObj …Run Code Online (Sandbox Code Playgroud) 我一直在使用TextTemplatingFilePreprocessor上T4阅读文章展示了如何动态地生成成为项目的一部分,并与该项目编译的代码.
是否可以使用T4生成在运行时编译,输出到DLL并加载和执行的代码,所述代码可以访问与dll相关的常用可见性功能?
如果是的话,请你指点一个例子.
我有效地尝试使用IL生成动态dll,而不是使用C#.
编辑
我需要的具体案例很简单.我正在编写一个消息路由器,用于将消息路由到服务.服务可以是本地的或远程的.声明性脚本编译为C#.动态部分是"这项服务是本地还是远程服务?".输出C#相应地改变.本地/远程的路由风格不同,因此具有动态特性.
这是我需要的一个例子.
下面是我用来生成一个简单方法的函数 -
//NOTE : SF = SyntaxFactory
List<ParameterSyntax> parameterList = new List<ParameterSyntax>
{
SF.Parameter(SF.Identifier(sourceObjectName))
};
// Create method
var method = SF.MethodDeclaration(SF.ParseName(destinationClass), functionName)
.WithBody(SF.Block(nodes))
.AddModifiers(SF.Token(SyntaxKind.PublicKeyword))
.AddParameterListParameters(parameterList.ToArray())
.NormalizeWhitespace();
// NEED TO ADD PARAMS TO CODE
Console.WriteLine(method.GetText());
Run Code Online (Sandbox Code Playgroud)
这是输出:
public XYZ MapABCToXYZ(fromObject) // Should be 'ABC fromObject'
{
XYZ myObject = new XYZ();
myObject.MyProperty = fromObject.MyProperty;
myObject.TestProperty = fromObject.TestProperty;
return myObject;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,参数不是"ABC fromObject",我一直在试图找出正确添加参数的确切语法.
我已经尝试了各种方法来找出参数语法,并且主要是空白.
编辑:想出来.只需在以下行中进行更改:
SF.Parameter(SF.Identifier(sourceObjectName)).WithType(SF.ParseTypeName(sourceClass))
Run Code Online (Sandbox Code Playgroud) 如何生成具有以下签名的方法?
public <T extends MyClass> void doSomething(T t)
Run Code Online (Sandbox Code Playgroud)
到目前为止,我有:
MethodSpec.methodBuilder("doSomething")
.addModifiers(Modifier.PUBLIC)
.addTypeVariable(TypeVariableName.get("T", MyClass.class))
.build()
Run Code Online (Sandbox Code Playgroud)
编辑这是上面的代码生成的内容(我不知道如何添加参数):
public <T extends Myclass> void doSomething()
Run Code Online (Sandbox Code Playgroud) 我正在尝试在命令提示符中执行此命令,以生成python的代码:
java -jar modules\swagger-codegen-cli\target\swagger-codegen-cli.jar \
generate \
-i http://localhost/test/swagger-docs/api-docs.json \
-l python -o c:\temp\python_testapi_client
Run Code Online (Sandbox Code Playgroud)
它告诉我这个错误:
Exception in thread "main" java.lang.RuntimeException: missing swagger input or config!
at io.swagger.codegen.DefaultGenerator.generate(DefaultGenerator.java:89)
at io.swagger.codegen.cmd.Generate.run(Generate.java:223)
at io.swagger.codegen.SwaggerCodegen.main(SwaggerCodegen.java:36)
Run Code Online (Sandbox Code Playgroud)
当我在浏览器中打开此文件时,它包含:
{
"swaggerVersion": "1.2",
"apis": [{
"path": "\/v1-machinetags",
"description": "Deletes machine tags by they titles."
}, {
"path": "\/v1-photos",
"description": "Uploads photo with tags."
}, {
"path": "\/v1-photos-bymachinetags",
"description": "List of photos with possibility filtering by Machine tags."
}, {
"path": "\/v1-photos-bytags",
"description": "List of photos with possibility filtering …Run Code Online (Sandbox Code Playgroud) code-generation ×10
c# ×4
c++ ×3
templates ×3
.net ×1
automapping ×1
inheritance ×1
java ×1
javapoet ×1
legacy-code ×1
macros ×1
nhibernate ×1
openapi ×1
razor ×1
roslyn ×1
swagger ×1
t4 ×1
xsd ×1
xsd.exe ×1