一个基于参数数量选择对象实例化的宏 [英] a macro to choose the object instantiation based on the amount of the arguments

查看:138
本文介绍了一个基于参数数量选择对象实例化的宏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个宏,以根据参数的数量选择对象实例化.宏必须支持零到两个参数. 期望的结果是选择以下三个之一,并将0传递给2个参数(如果有):

I'm trying to create a macro to choose the object instantiation based on the amount of the arguments. Macro must support zero to two arguments. The desired result is selecting one of the following three, and pass 0 to 2 arguments if any:

    MyClass obj(hardcoded_arg); // Choose this one if no arguments passed to a macro
    MyClass obj(hardcoded_arg,arg1); // This one if a single argument passed
    MyClass obj(arg1,arg2); // This one if two arguments passed

这是我要实现的目标:

    #define TYPE1(...)       MyClass obj(hardcoded_arg);
    #define TYPE2(arg1)      MyClass obj(hardcoded_arg,arg1);
    #define TYPE3(arg1,arg2) MyClass obj(arg1,arg2);

    #define EXPAND( x ) x
    #define GET_TYPE(DUMMY, _1 ,_2, NAME, ...) NAME
    #define INSTANTIATE(...) EXPAND(GET_TYPE(DUMMY ,##__VA_ARGS__, TYPE3, TYPE2, TYPE1))(__VA_ARGS__)

    INSTANTIATE()
    INSTANTIATE(1)
    INSTANTIATE(1,2)

我尝试使用

    #define VA_ARGS(...) , ##__VA_ARGS__ 
    #define INSTANTIATE(...) EXPAND(GET_TYPE(DUMMY VA_ARGS(__VA_ARGS__), TYPE3, TYPE2, TYPE1))(__VA_ARGS__)

但它也没有解决此案. 像INSTANTIATE(,)这样的解决方案是la脚的.

but it also didn't resolve the case. The solutions like INSTANTIATE(,) are lame.

任何建议都值得赞赏!

推荐答案

重载工厂函数如何?喜欢

How about overloaded factory functions? Like

MyClass create() { return MyClass(hardecoded_arg); }
MyClass create(type2 arg2) { return MyClass(hardcoded_arg, arg2); }
MyClass create(type1 arg1, type2 arg2) { return MyClass(arg1, arg2); }

类型安全,无需使用预处理器.

Type-safe, and no need to play tricks with the preprocessor.

这篇关于一个基于参数数量选择对象实例化的宏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆