std::tuple
のすべての要素が特定の条件を満たすかどうかを検証しようとしています。折り畳み式ではない(まだ)実装されているので、すべてのstd :: tuple要素が条件+設計上の問題を満たしているかどうか確認してください
template <typename F, typename Tuple, size_t...Is>
_CR_INLINE bool tuple_all_of(F&& fn, Tuple&& t, std::index_sequence<Is...>) {
return (std::forward<F>(fn)(std::get<Is>(std::forward<Tuple>(t))) && ...);
}
template <typename F, typename Tuple>
_CR_INLINE bool tuple_all_of(F&& fn, Tuple&& t) {
return tuple_all_of(std::forward<F>(fn), std::forward<Tuple>(t),
std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<Tuple>>>());
}
それは、最新の打ち鳴らすとgccでコンパイルしますが、MSVCで失敗します。私の現在のソリューションは、C++ 17倍epxressionsを使用しています。 (https://blogs.msdn.microsoft.com/vcblog/2017/05/10/c17-features-in-vs-2017-3/)
折り畳み式を使用しないで同様のソリューションがありますか?
これは、使用されることになっています方法です:
template<typename...Components, typename Callable>
void FindComponents(Callable&& fn) {
for (auto& node : m_Entities) {
auto tp = std::make_tuple(node.GetComponent<Components>()...);
if (!tuple_all_of([](auto& p) { return p != nullptr; }, tp))
continue;
apply_from_tuple(fn, tp);
}
}
ノードが接続要求されたコンポーネント(すなわちGetComponent
= nullptrを!)がある場合にのみ、だから私はfn
を呼び出しています。たぶん、より良い解決策がありますか?
std::apply
を使用することができ
MSVC 2017.5は、私の知る限りでは、式を折る含まれています。 – DeiDei