C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- std::apply
- åºç¹æ§æµè¯å® (C++20)
- ç¨åºæ¯æå·¥å ·
- std::initializer_list
- 彿°å¯¹è±¡
- std::hash
- std::pair
- std::tuple
- std::optional
- std::any
- std::variant
- æ ¼å¼ååº (C++20)
- std::integer_sequence
- std::exchange
- std::make_from_tuple
- std::launder
- std::to_chars
- std::from_chars
- std::as_const
- std::source_location
- å忰彿°
- std::bitset
- std::cmp_equal, cmp_not_equal, cmp_less, cmp_greater, cmp_less_equal, cmp_greater_equal
- std::in_range
- std::declval
- std::forward
- std::move
- std::move_if_noexcept
- std::chars_format
- std::piecewise_construct_t
- std::piecewise_construct
- std::in_place, std::in_place_type, std::in_place_index, std::in_place_t, std::in_place_type_t, std::in_place_index_t
- 注é
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >å·¥å ·åº > std::apply
std::apply
| å®ä¹äºå¤´æä»¶ <tuple>
|
||
| template <class F, class Tuple> constexpr decltype(auto) apply(F&& f, Tuple&& t); |
(C++17 èµ·) | |
以忰çå
ç»è°ç¨å¯è°ç¨ (Callable) 对象 f ã
åæ°
| f | - | è¦è°ç¨çå¯è°ç¨ (Callable) 对象 |
| t | - | 以å
¶å
ç´ ä¸º f çåæ°çå
ç»
|
è¿åå¼
f æè¿åçå¼ã
注解
å ç»ä¸å¿ æ¯ std::tuple ï¼å¯ä»¥ä¸ºä»»ä½æ¯æ std::get å std::tuple_size çç±»åææ¿ä»£ï¼ç¹å«æ¯å¯ä»¥ç¨ std::array å std::pair ã
å¯è½çå®ç°
namespace detail { template <class F, class Tuple, std::size_t... I> constexpr decltype(auto) apply_impl(F&& f, Tuple&& t, std::index_sequence<I...>) { // æ¤å®ç°ä» C++20 èµ·åæ³ï¼ç»ç± P1065R2 ï¼ // C++17 ä¸ï¼å®é ä¸å¨æ¤éè¦ std::invoke ç constexpr å¯¹åº return std::invoke(std::forward<F>(f), std::get<I>(std::forward<Tuple>(t))...); } } // namespace detail  template <class F, class Tuple> constexpr decltype(auto) apply(F&& f, Tuple&& t) { return detail::apply_impl( std::forward<F>(f), std::forward<Tuple>(t), std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<Tuple>>>{}); } |
示ä¾
è¿è¡æ¤ä»£ç
#include <iostream> #include <tuple> #include <utility>  int add(int first, int second) { return first + second; }  template<typename T> T add_generic(T first, T second) { return first + second; }  auto add_lambda = [](auto first, auto second) { return first + second; };  template<typename... Ts> std::ostream& operator<<(std::ostream& os, std::tuple<Ts...> const& theTuple) { std::apply ( [&os](Ts const&... tupleArgs) { os << '['; std::size_t n{0}; ((os << tupleArgs << (++n != sizeof...(Ts) ? ", " : "")), ...); os << ']'; }, theTuple ); return os; }  int main() { // OK std::cout << std::apply(add, std::pair(1, 2)) << '\n';  // éè¯¯ï¼æ æ³æ¨å¯¼å½æ°ç±»å // std::cout << std::apply(add_generic, std::make_pair(2.0f, 3.0f)) << '\n';  // OK std::cout << std::apply(add_lambda, std::pair(2.0f, 3.0f)) << '\n';  // è¿é¶ç¤ºä¾ std::tuple myTuple(25, "Hello", 9.31f, 'c'); std::cout << myTuple << '\n'; }
è¾åºï¼
3 5
åé
å建ä¸ä¸ª tuple 对象ï¼å
¶ç±»åæ ¹æ®åå®åç±»åå®ä¹ (彿°æ¨¡æ¿) | |
å建转åå¼ç¨ç tuple (彿°æ¨¡æ¿) | |
| (C++17) |
以ä¸ä¸ªå®åå
ç»æé 对象 (彿°æ¨¡æ¿) |
| (C++17) |
以ç»å®å®åè°ç¨ä»»æå¯è°ç¨ (Callable) 对象 (彿°æ¨¡æ¿) |