是否可以使用折疊運算式實作以下目標?
template<class... Args>
auto foo(Args... args)
{
//calling foo(x0, x1, x2) should be exactly equivalent to
//calling fn(x2 ^ fn(x1 ^ fn(x0)))
}
uj5u.com熱心網友回復:
您可以添加一個強制引數foo并檢查您是否有其他帶有constexpr-if的引數。
編輯:我不小心錯過了它應該是折疊運算式的要求,所以它使用包擴展和遞回。
template <class T, class... Args>
constexpr auto foo(T&& x, Args&&... args) {
if constexpr (sizeof...(args)) {
return fn(x ^ foo(std::forward<Args>(args)...));
} else {
return fn(x);
}
}
這要求您在呼叫函式時反轉引數:
foo(x2, x1, x0)=>fn(x2 ^ fn(x1 ^ fn(x0)))
演示
uj5u.com熱心網友回復:
如果您堅持使用折疊運算式,則可能會使這些方面的某些東西起作用(未經測驗):
template <typename T>
struct Wrapper {
T& val;
};
template <typename T, typename U>
auto operator^(Wrapper<T> l, Wrapper<U> r) {
return Wrapper(r.val ^ fn(l.val));
}
template<class... Args>
auto foo(Args... args)
{
return fn((... ^ Wrapper<Args>(args)).val);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/517066.html
