আমি জিসিসি 10 তে সি ++ 20 কনস্টিভাল নিয়ে ঘোরাঘুরি করছি এবং এই কোডটি লিখেছি
#include <optional>
#include <tuple>
#include <iostream>
template <std::size_t N, typename Predicate, typename Tuple>
consteval std::optional<std::size_t> find_if_impl(Predicate&& pred,
Tuple&& t) noexcept {
constexpr std::size_t I = std::tuple_size_v<std::decay_t<decltype(t)>> - N;
if constexpr (N == 0u) {
return std::nullopt;
} else {
return pred(std::get<I>(t))
? std::make_optional(I)
: find_if_impl<N - 1u>(std::forward<decltype(pred)>(pred),
std::forward<decltype(t)>(t));
}
}
template <typename Predicate, typename Tuple>
consteval std::optional<std::size_t> find_if(Predicate&& pred,
Tuple&& t) noexcept {
return find_if_impl<std::tuple_size_v<std::decay_t<decltype(t)>>>(
std::forward<decltype(pred)>(pred), std::forward<decltype(t)>(t));
}
constexpr auto is_integral = [](auto&& x) noexcept {
return std::is_integral_v<std::decay_t<decltype(x)>>;
};
int main() {
auto t0 = std::make_tuple(9, 1.f, 2.f);
constexpr auto i = find_if(is_integral, t0);
if constexpr(i.has_value()) {
std::cout << std::get<i.value()>(t0) << std::endl;
}
}
যা এসটিএল আলগোরিদিম সন্ধানের মতো কাজ করবে বলে মনে করা হয় কিন্তু টিউপসগুলিতে এবং পুনরাবৃত্তিকে ফিরিয়ে দেওয়ার পরিবর্তে এটি একটি সংকলন টাইম প্রিকিকেটের উপর ভিত্তি করে anচ্ছিক সূচক ফেরত দেয়। এখন এই কোডটি ঠিক সূক্ষ্ম সংকলন করে এবং এটি মুদ্রণ করে
9
তবে যদি টিপলে কোনও অবিচ্ছেদ্য ধরণের উপাদান থাকে না তবে প্রোগ্রামটি সংকলন করে না, কারণ i.value () এখনও খালি alচ্ছিকভাবে ডাকা হয়। এখন তা কেন?