gpt4 book ai didi

C++ 可变数量的参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:22:04 24 4
gpt4 key购买 nike

我需要定义一个可以接受可变数量参数的虚函数,问题是 C 风格的省略号不适用于非 pod 类型,我的内存量有限 (2KB),所以我试图避免只分配临时对象传递给函数,所有参数都将是同一类型(自定义共享指针),我也无权访问 STL 或 boost。有没有 C++ 技巧可以让我调用带有可变参数的函数?

最佳答案

假设你的参数类型属于 Arg 类,你可以试试这个:

class ArgUser {
public:
// syntactic sugar:
void method() { // nullary
doMethod();
}
void method( const Arg & a1 ) { // unary
doMethod( &a1 );
}
void method( const Arg & a1, const Arg & a2 ) { // binary
doMethod( &a1, &a2 );
}
// and so on, until max arity
private:
// actual virtual function:
virtual void doMethod( const Arg * a1=0, const Arg * a2=0 /*etc, until max arity */ ) = 0;
};

此解决方案具有以下属性:

  1. 它使用 NVI idiom
  2. 它使用指针,因为它们不会导致创建临时变量,即使对于未使用的默认参数也是如此。
  3. 它将丑陋的指针封装在(内联)包装器方法中。

另一种解决方案(可能更有效也可能不更有效)是这样的:

class AltArgUser {
public:
// syntactic sugar:
void method() { // nullary
doMethod( 0, 0 );
}
void method( const Arg & a1 ) { // unary
doMethod( &&a1, 1 );
}
void method( const Arg & a1, const Arg & a2 ) { // binary
const Arg * args[] = { &a1, &a2 };
doMethod( args, 2 );
}
// and so on, until max arity
private:
// actual virtual function:
virtual void doMethod( const Arg * args[], size_t numArgs ) = 0;
};

要决定使用哪一个,您需要研究在您的特定平台上为每种方法生成的汇编器。无论您选择什么,都应该保留包装函数。

关于C++ 可变数量的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5807009/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com