我有寫函式來推斷我轉發給函式的引數數量。像這樣的東西:
template<typename Arg>
constexpr size_t get_init_size(Arg arg, size_t i) {
return i 1;
}
template<typename T, typename ... Args>
constexpr size_t get_init_size(T First_arg, Args ... args, size_t i) {
return get_init_size(args... , i 1);
}
auto create_ipv4_header() {
size_t x = get_init_size(0b01, 0b10, 0b01, static_cast<size_t>(0));
return x //<= must return 3
}
但是編譯器寫: 錯誤:沒有匹配的函式呼叫'get_init_size(int,int,int,size_t)' 所以這是可變引數模板中的問題?如果我將可變引數模板更改為這樣的內容,還有一件事:
template<typename T, typename ... Args>
constexpr size_t get_init_size(T First_arg, Args ... args, size_t i = 0)
我可以放下最后一個引數嗎?(我沒有用可變引數模板測驗它)謝謝你的幫助!
uj5u.com熱心網友回復:
您不需要撰寫遞回模板函式來執行此操作,您可以使用sizeof...()引數包型別上的運算子直接獲取元素數:
template<typename... Args>
constexpr std::size_t get_init_size(Args&&...) {
return sizeof...(Args);
}
在這里查看它的實際效果。
你的函式不起作用的原因是因為貪婪地推導了一個引數包;意義Args... args匹配0b10,0b01 和 static_cast<size_t>(0)。然后因為沒有size_t i再匹配 的引數,替換失敗,剩下的唯一候選是 的第一個版本get_init_size(),這當然也不是匹配。在引數包之后有額外的引數總是很難或不可能的。不過你可以移到size_t i前面。另一種方法是不i作為引數傳遞,而是添加 1到回傳值中:
template<typename Arg>
constexpr std::size_t get_init_size(Arg&&) {
return 1;
}
template<typename T, typename... Args>
constexpr std::size_t get_init_size(T&&, Args&&... args) {
return get_init_size(args...) 1;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/361053.html
上一篇:亂數生成模板函式(靜態斷言失敗)
