簡體   English   中英

C ++:函數指向具有可變數量參數的函數

[英]C++: Function pointer to functions with variable number of arguments

我試圖找出一種方法,如何能夠為具有不同數量的參數的函數分配函數指針。

我有一個while循環,它將許多不同的函數作為一個條件語句,所以我沒有用完全相同的代碼編寫多個while循環,而是希望有一個帶有函數指針的函數。 所有函數都是bool f(...)格式。 我認為一些代碼最能說明我的意思:

int a, b, c, d;
MyClass* my_class;

typedef bool (MyClass::*my_fun_t)();
my_fun_t my_fun;

if (condition1)
    my_fun = &MyClass::function_one();
else if (condition2)
    my_fun = &MyClass::function_two(a, b);
else if (condition3)
    my_fun = &MyClass::function_three(a, b, c);
else if (condition4)
    my_fun = &MyClass::function_four(a, b, c, d);

while ((my_class->*my_fun)()) 
{ ... }

現在這顯然不起作用,因為函數具有不同的簽名。 是否可以以類似的方式使其工作? 我應該看一下functoids嗎?

您可以使用std::function<>std::bind()

#include <functional>

using std::placeholders::_1;

typedef std::function<bool(MyClass&)> my_fun_t;
my_fun_t my_fun;

if (condition1)
    my_fun = std::bind(&MyClass::function_one, _1);
else if (condition2)
    my_fun = std::bind(&MyClass::function_two, _1, a, b);
else if (condition3)
    my_fun = std::bind(&MyClass::function_three, _1, a, b, c);
else if (condition4)
    my_fun = std::bind(&MyClass::function_four, _1, a, b, c, d);

while (my_fun(my_class)) { ... }

這些假設您將使用C ++ 11。 如果您不能使用C ++ 11但可以使用TR1,請將所有std::替換為std::tr1:: 還有一個Boost實現

這對我有用:

#include <iostream>
#include <cstdarg>

using namespace std;

class MyInterface
{
public:
    virtual bool func(int argc, ...) = 0;
};

class MyImpl : public MyInterface
{
public:
    virtual bool func(int argc, ...);
};

bool MyImpl::func(int argc, ...)
{
    va_list varargs;
    va_start(varargs,argc);
    cout << "Arguments passed:" << endl;
    for(int i = 0; i < argc; ++i)
    {
        // expect double values
        double val = va_arg(varargs,double);
        cout << val << endl;
    }
    va_end(varargs);
    return true;
}

typedef bool (MyInterface::*MyFunc)(int, ...);

int main() {

    MyImpl impl;
    MyInterface* interface = &impl;
    MyFunc pfunc = &MyInterface::func;

    if(!(interface->*pfunc)(2,double(3.14),double(2.72)))
    {
        return 1;
    }
    return 0;
}

輸出:

Arguments passed:
3.14
2.72

顯然,您可以使用變量參數為(member-)函數聲明和使用函數指針。

您希望std::function ,一個多態函數對象和std::bind通過將參數綁定到其他仿函數的參數來創建函數對象。

如果你不能使用C ++ 11,那么boost::functionboost::bind是等價的,雖然稍微有些限制。

std::function<bool()> my_fun;

if (condition1)
    my_fun = std::bind(&MyClass::function_one, my_class);
else if (condition2)
    my_fun = std::bind(&MyClass::function_two, my_class, a, b);
else if (condition3)
    my_fun = std::bind(&MyClass::function_three, my_class, a, b, c);
else if (condition4)
    my_fun = std::bind(&MyClass::function_four, my_class, a, b, c, d);

while (my_fun()) 
{ ... }

我試圖找出一種方法,如何能夠為具有不同數量的參數的函數分配函數指針。

你不能。 函數指針特定於一個函數簽名。 這完全合乎邏輯:你將如何調用這樣的函數? (是的,C允許調用函數而不在其聲明中指定函數有多少參數,但這在C ++中不起作用,因為它顛覆了類型系統。)

我應該看一下functoids嗎?

一般是的,但他們沒有解決這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM