簡體   English   中英

是否可以在編譯時檢測函數的默認參數?

[英]Is it possible to detect the default parameters of a function at compile-time?

#include <thread>
#include <functional>

using namespace std;

void f(int n = 7)
{}

void g(function<void()> fn)
{
    fn(); // same as f(7)
}

template<typename Callable>
auto GetDefaultArg(Callable fn, size_t arg_ordinal)
{
    // What to put here?
}

int main()
{
    auto fn = bind(f, GetDefaultArg(f, 1));
    g(fn);  
}

如上面的代碼所示,我想實現一個模板函數GetDefaultArg來檢測函數的默認paratemters。

它在當前的C ++中可能嗎?

不,您無法在編譯時檢測到默認參數。

您已在函數定義中聲明了默認參數。 但是默認參數沒有鏈接到函數本身,而是在函數調用范圍內已知的函數聲明。

否則說明:您可以為同一功能設置不同的默認參數集。

為了增加Chrisophe的優秀答案 ,我將舉例說明他的意思。

我們可以稍后使用其他默認值重新聲明一個函數!

這是什么意思?

讓我們從函數聲明開始:

// initial declaration; nothing defaulted
void foo(int a, char b, bool c, double d);

我有一些沒有默認參數的函數foo 我寫了一個調用foo的函數:

void CallFoo1()
{
    // no default params
    foo(1, 'b', true, 2.0);
}

它必須為foo每個參數提供一個參數。

但是,現在我可以重新聲明 foo (只要我還沒有定義它),並給最后一個參數一個默認值:

// add default for last argument
void foo(int a, char b, bool c, double d= 2.0);

然后我寫了另一個調用foo函數。 除了這次我可以把最后一個參數留空:

void CallFoo2()
{
    foo(1, 'b', true);
}

我可以繼續這樣做,每次都使用新的默認值重新聲明:

// add default for third argument
void foo(int a, char b, bool c=true, double d);

void CallFoo3()
{
    foo(1, 'b');
}

// add default for second argument
void foo(int a, char b='b', bool c, double d);

void CallFoo4()
{
    foo(1);
}

// add default for first argument
void foo(int a=1, char b, bool c, double d);

void CallFoo5()
{
    // everything is defaulted!
    foo();
}

最后重新聲明后foo ,申報foo由違約值的聯盟(注:我不能再默認值)。

最后我可以提供foo的定義:

void foo(int a, char b, bool c, double d)
{
    std::cout << "a = " << a << " b = " << b << " c = " << std::boolalpha << c << " d = " << d << std::endl;
}

讓我們試一試:

int main()
{
    CallFoo1();
    CallFoo2();
    CallFoo3();
    CallFoo4();
    CallFoo5();
}

輸出:

a = 1 b = b c = true d = 2
a = 1 b = b c = true d = 2
a = 1 b = b c = true d = 2
a = 1 b = b c = true d = 2
a = 1 b = b c = true d = 2

現場演示

暫無
暫無

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

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