我有一個接受可呼叫的函式,我想確保傳遞的可呼叫的簽名正是指定的簽名。
#include <type_traits>
#include <cassert>
#include <iostream>
template<typename F>
requires std::is_invocable_v<F, float&>
float fn(F&& f) {
float v;
f(v);
return v;
}
int main() {
float v = 17.0;
std::cout << "v=" << v << std::endl; // returns v=17
float v2 = fn([&v](float& b){
b = v;
});
std::cout << "v2=" << v2 << std::endl; // returns v2=17
float v3 = fn([&v](float b){
b = v;
});
std::cout << "v3=" << v3 << std::endl; // returns some random value (uninitialized)
return 0;
}
https://godbolt.org/z/T7xGsqzvn
這里 v3 未初始化,因為 lambda 通過值而不是參考獲取引數。
我現在的問題是,我如何確保傳遞給 fn 的可呼叫物件總是通過參考獲取,因為我的代碼可以正常作業。
謝謝你。
uj5u.com熱心網友回復:
您可以將另一個約束添加到fn:
template<typename F>
requires std::is_invocable_v<F, float&>
and (not std::is_invocable_v<F, float>) // <--
float fn(F&& f) {
//...
}
住在這里。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/410968.html
標籤:
上一篇:無法創建物體框架代碼優先遷移
下一篇:如何在C 類中初始化模板物件?
