标签: code-generation

C++代码生成

在我的史诗般的探索中,让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)

c++ templates code-generation c-preprocessor

10
推荐指数
2
解决办法
6159
查看次数

从现有DB和Fluent NHibernate自动映射生成C#实体

我正在使用一个使用一些非常难看的约定的现有数据库.我想使用NHibernate,我想我可以使用Fluent NHibernate的自动映射约定修复所有这些丑陋的数据库约定.我想避免手工编写所有实体类.(这是LINQ to SQL和SubSonic的吸引力)

是否可以根据我的数据库模式和Fluent NHibernate中指定的映射生成我的C#实体?

旁白:你知道NHibernate的设计师吗?

c# nhibernate code-generation fluent-nhibernate automapping

10
推荐指数
2
解决办法
1万
查看次数

通过继承减少模板膨胀

有没有人有使用继承减少模板代码膨胀的经验?

我犹豫以这种方式重写我们的容器:

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++ inheritance templates code-generation

10
推荐指数
1
解决办法
1212
查看次数

用razor生成代码?

之前我投入了大量的时间研究剃刀和其适用性,我想问一下你剃刀大师,如果能使用剃刀生成C#代码?您可以立即想到的任何问题?

code-generation razor

10
推荐指数
3
解决办法
4849
查看次数

引用常见类型的XSD Gen类

我正在使用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)

c# xsd code-generation xsd.exe

10
推荐指数
1
解决办法
5018
查看次数

如何为遗留API /框架(C++宏与C++模板与代码生成器)实现大量复杂包装器?

我们使用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)

c++ macros templates code-generation legacy-code

10
推荐指数
1
解决办法
518
查看次数

使用T4和C#在运行时编译动态代码

我一直在使用TextTemplatingFilePreprocessor上T4阅读文章展示了如何动态地生成成为项目的一部分,并与该项目编译的代码.

是否可以使用T4生成在运行时编译,输出到DLL并加载和执行的代码,所述代码可以访问与dll相关的常用可见性功能?

如果是的话,请你指点一个例子.

我有效地尝试使用IL生成动态dll,而不是使用C#.

编辑

我需要的具体案例很简单.我正在编写一个消息路由器,用于将消息路由到服务.服务可以是本地的或远程的.声明性脚本编译为C#.动态部分是"这项服务是本地还是远程服务?".输出C#相应地改变.本地/远程的路由风格不同,因此具有动态特性.

这是我需要的一个例子.

.net c# t4 code-generation

10
推荐指数
1
解决办法
4530
查看次数

如何在Roslyn(Microsoft.CodeAnalysis)中为生成的方法添加参数? - 需要确切的语法

下面是我用来生成一个简单方法的函数 -

//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)

c# code-analysis code-generation roslyn

10
推荐指数
1
解决办法
1449
查看次数

JavaPoet添加通用参数

如何生成具有以下签名的方法?

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)

java code-generation javapoet

10
推荐指数
1
解决办法
3149
查看次数

swagger-codegen-cli:java.lang.RuntimeException:缺少swagger输入或配置

我正在尝试在命令提示符中执行此命令,以生成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 swagger openapi

10
推荐指数
0
解决办法
2993
查看次数