c++ - 如何将可变参数转换为容器类?

标签 c++

我正在研究可以让我更轻松地使用脚本语言 (Lua) 调用函数的方法,其中一个想法是使用可变参数。有两种方法可以做到这一点:

Call( int count, ... )

Call( const char* args, ... )

像 printf。我认为第一个会更容易维护,所以我尝试通过制作一个包装器来管理参数类型来做到这一点。它看起来像这样:

class ArgWrapper
{
public:
    ArgWrapper();

    ArgWrapper( const int& v ) { val.i = v; type = INT; }
    ArgWrapper( const bool& v ) { val.b = v; type = BOOL; }
    ArgWrapper( const float& v ) { val.f = v; type = FLOAT; }
    ArgWrapper( const double& v ) { val.d = v; type = DOUBLE; }

    operator int() { return val.i; }
    operator bool() { return val.b; }
    operator float() { return val.f; }
    operator double() { return val.d; }

    enum {
        INT,
        BOOL,
        FLOAT,
        DOUBLE
    } type;

    union
    {
        int i;
        bool b;
        float f;
        double d;
    } val;
};

这工作得很好而且花花公子,但是当我真正尝试在可变参数构造中使它工作时,事实证明这些值实际上并没有被强制转换。

void printArgs( int c, ArgWrapper... )
{
    va_list ap;
    va_start( ap, c );

    for ( int i = 0; i < c; i++ )
    {
        ArgWrapper arg = va_arg( ap, ArgWrapper );
        if ( arg.type == arg.INT ) std::cout << "integer - " << (int)arg << std::endl;
        if ( arg.type == arg.BOOL ) std::cout << "boolean - " << std::boolalpha << (bool)arg << std::endl;
        if ( arg.type == arg.FLOAT ) std::cout << "float - " << (float)arg << std::endl;
        if ( arg.type == arg.DOUBLE ) std::cout << "double - " << (double)arg << std::endl;
    }

    va_end( ap );
}

...

printArgs( 4, 1337.0f, 18, 37.0, true );

上面的结果是垃圾,而这工作得很好:

printArgs( 4, (ArgWrapper)1337.0f, (ArgWrapper)18, (ArgWrapper)37.0, (ArgWrapper)true );

如何指定每个可变参数应具有相同的通用类型?

最佳答案

当您使用 C++03 时,您不能这样做,因为使用 c 风格省略号 ... 的可变参数不以任何方式携带类型信息。这就是为什么像 printf() 这样的东西使用格式说明符的原因,因为它需要一种方法来知道将内容转换为什么。

当您可以使用 C++11 时,您应该立即使用可变参数模板,这样就不需要像 ArgWrapper 这样的任何类型的帮助器了。

关于c++ - 如何将可变参数转换为容器类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8852106/

相关文章:

c++ - 椭圆旋转不居中

c++ - 根据 move 赋值运算符 move 构造函数

c++ - 需要帮助解决编译器错误 : error: invalid conversion from ‘int’ to ‘GIOCondition’

c++ - C++ 中的 Stackdump 不显示堆栈跟踪

c++ - 在 64 位 open suse linux 上构建 32 exe 出现链接错误

c++ - 错误 : invalid initialization of reference of type ‘LineLayer&’ from expression of type ‘Layer’

C++使用之后声明的类的对象

c++ - 编译器错误帮助(E2209 无法打开包含文件)

c++ - 在 Mac OS X Lion 上使用 OpenMP 编译失败(memcpy 和 SSE 内在函数)

c++ - 为什么在尝试使用 C++ 创建二维数组时出现此错误?