[英]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.