我有这个函数调用:
uint32_t func(uint32_t* a, uint32_t b)
我想用这样的整数文字调用它:
func(0, b);
其中b
是uint32_t
。
有没有办法可以在不创建中间变量的情况下做到这一点? 即我想避免这样做:
uint32_t a = 0;
func(a, b);
答案 0 :(得分:3)
辅助类:
struct int_ptr {
int v;
operator int *() { return &v; }
};
int foo(int *a, int b);
void bar()
{
foo(int_ptr{0}, 0);
}
这导致构造一个临时int_ptr
类,将其v
成员初始化为0.这将作为参数传递给一个带int *
的函数,{{ 1}}提供了一个合适的int_ptr
方法,它将右指针传递给函数。
这整个纸牌都取决于operator *
临时存在直到函数调用结束的事实。您应该为帮助程序类选择一个名称以强调该事实。如果你总是用它来传递指向0到foo的指针,那么拼写出来:
int_ptr
因此,在其他情境中使用它看起来非常不合适,即
struct zero_value_to_foo {
int v=0;
operator int *() { return &v; }
};
int foo(int *a, int b);
void bar()
{
foo(zero_value_to_foo{}, 0);
}
这会编译,但会留下一个悬垂的指针;但希望“zero_value_to_foo”标签能给出一个问题的线索,说明这里出了问题。
你可以采取的另一件小事来帮助自己滥用这一点,对于运营商来说是use a ref qualifier:
int *p=zero_value_to_foo{};
有了这个,
struct zero_value_to_foo {
int v=0;
operator int *() && { return &v; }
};
仍在编译,但不是这样:
foo(zero_value_to_foo{}, 0);
除了在上下文中意味着难以使用它之外,可以采取的措施越多,就越容易出错。
答案 1 :(得分:1)
我假设您要将指针传递给整数0,而不是0(NULL)指针。
如果您不介意分配动态内存,可以执行以下操作:
func(new uint32_t(0), b);
但是,你必须确保释放函数内的内存。
或者,您可以使用R值引用(c ++ 11)。 然后,您可以使用引用的地址作为函数内的指针。
R值参考语法:
uint32_t func(uint32_t &&a, uint32_t b);