有没有办法调用函数期望指针而不创建变量?

时间:2018-04-28 02:28:29

标签: c++ pointers

我有这个函数调用:

uint32_t func(uint32_t* a, uint32_t b)

我想用这样的整数文字调用它:

func(0, b);

其中buint32_t

有没有办法可以在不创建中间变量的情况下做到这一点? 即我想避免这样做:

uint32_t a = 0;
func(a, b);

2 个答案:

答案 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);