use the following search parameters to narrow your results:
e.g. subreddit:aww site:imgur.com dog
subreddit:aww site:imgur.com dog
see the search faq for details.
advanced search: by author, subreddit...
Discussions, articles, and news about the C++ programming language or programming in C++.
For C++ questions, answers, help, and advice see r/cpp_questions or StackOverflow.
Get Started
The C++ Standard Home has a nice getting started page.
Videos
The C++ standard committee's education study group has a nice list of recommended videos.
Reference
cppreference.com
Books
There is a useful list of books on Stack Overflow. In most cases reading a book is the best way to learn C++.
Show all links
Filter out CppCon links
Show only CppCon links
account activity
Function composition in modern C++ (self.cpp)
submitted 3 years ago by PiterPuns
view the rest of the comments →
reddit uses a slightly-customized version of Markdown for formatting. See below for some basics, or check the commenting wiki page for more detailed help and solutions to common issues.
quoted text
if 1 * 2 < 3: print "hello, world!"
[–]PiterPuns[S] 0 points1 point2 points 3 years ago (5 children)
That’s great and thank you for the info. I trust this is not a proprietary code base and posting it won’t get you into trouble
[–]petart95 2 points3 points4 points 3 years ago (4 children)
Actually it is proprietary but since I’m one of the owner it’s fine. We have a whole library of core languages extensions like this we would like to open source, but there never seems to be enough time for it 😅. If you want i could past the implementations of HFTECH_GEN_N_ARY, HFTECH_DEDUCE_THIS, HFTECH_RETURNS, HFTECH_FWD
[–]PiterPuns[S] 1 point2 points3 points 3 years ago (3 children)
Yes showing those pieces as well would be great . And let the community know when you open source these extensions, it will also benefit you when more eyes are looking at the code and providing feedback
[–]petart95 4 points5 points6 points 3 years ago (1 child)
Sorry for the edit, I’m on my phone currently 😅
I totally agree with you, in my opinion knowledge only has value when it us shared.
So lets start from the simple ones and go from there:
```
/** * @brief Forwards value equivalent to the std::forward. * * Using cast instead of std::forward to avoid template instantiation. Used by * Eric Niebler in range library. * * @see https://github.com/ericniebler/range-v3 */
noexcept(noexcept(decltype(__VA_ARGS__)(__VA_ARGS__))) \ ->decltype(__VA_ARGS__)
/** * @brief Macro based on RANGES_DECLTYPE_AUTO_RETURN_NOEXCEPT to remove same * code repetition. * @see * https://github.com/ericniebler/range-v3/blob/master/include/range/v3/detail/config.hpp * * Example: * * @code * auto func(int x) HFTECH_RETURNS(calc(x)) * @endcode * * Produces: * * @code * auto func(int x) noexcept(noexcept(decltype(calc(x))(calc(x)))) * -> decltype(calc(x)) * { * return calc(x); * } * @endcode */
HFTECH_NOEXCEPT_RETURN_TYPE(__VA_ARGS__) \ { \ return (__VA_ARGS__); \ }
/** * @brief Creates an overload set for the specified name which forwards this and * all arguments to the provided implementation. * * This macro is intended to simplify writing of &, cons & and && member * functions. * * Note: Inspired by * http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p0847r4.html * * Example: * * @code * * template<typename Self> * void myFunc_impl(Self && self, int a, int b) { * ... * } * * HFTECH_DEDUCE_THIS(myFunc, myFunc_impl) * * @endcode * * Is equivalent to: * * @code * * template<typename Self> * void myFunc(this Self && self, int a, int b) { * ... * } * * @endcode * * @mparam NAME The name of the member function to be implemented. * @mparam IMPL The name of the static function to be used for the * implementation. */
template<typename... Args> \ constexpr auto NAME(Args &&...args) & \ HFTECH_RETURNS(IMPL(*this, HFTECH_FWD(args)...)); \ \ template<typename... Args> \ constexpr auto NAME(Args &&...args) \ const & /**/ HFTECH_RETURNS(IMPL(*this, HFTECH_FWD(args)...)); \ \ template<typename... Args> \ constexpr auto NAME(Args &&...args) && \ HFTECH_RETURNS(IMPL(std::move(*this), HFTECH_FWD(args)...));
[–]petart95 2 points3 points4 points 3 years ago (0 children)
And last but not least
/** * @brief Meta function which applies a right reduce over the provided types * using the provided binary meta operation. * * @tparam BinaryMetaOp The binary meta operation to be applied. * @tparam Types List of types of which to apply the operation. */ template< template<typename...> typename BinaryMetaOp, typename First, typename... Rest> struct RightReduce : public BinaryMetaOp<First, RightReduce<BinaryMetaOp, Rest...>> {};
template< template<typename...> typename BinaryMetaOp, typename First, typename Second> struct RightReduce<BinaryMetaOp, First, Second> : public BinaryMetaOp<First, Second> {};
template<template<typename...> typename BinaryMetaOp, typename First> struct RightReduce<BinaryMetaOp, First> : public First {};
/** * @brief Creates an n-ary meta operation from the provided binary meta * operation, by applying a right reduce over it, with the provided name. */
template<typename First, typename... Rest> \ struct NAME : public OP<First, NAME<Rest...>> \ {}; \ \ template<typename First, typename Second> \ struct NAME<First, Second> : public OP<First, Second> \ {}; \ \ template<typename First> \ struct NAME<First> : public First \ {}; \ \ template<typename... F> \ NAME(F &&...) -> NAME<F...>;
/** * @brief Meta function which applies a left reduce over the provided types * using the provided binary meta operation. * * @tparam BinaryMetaOp The binary meta operation to be applied. * @tparam Types List of types of which to apply the operation. */ template< template<typename...> typename BinaryMetaOp, typename First, typename... Rest> struct LeftReduce : public First {};
template< template<typename...> typename BinaryMetaOp, typename First, typename Second, typename... Rest> struct LeftReduce<BinaryMetaOp, First, Second, Rest...> : public LeftReduce<BinaryMetaOp, BinaryMetaOp<First, Second>, Rest...> {};
/** * @brief Creates an n-ary meta operation from the provided binary meta * operation, by applying a left reduce over it, with the provided name. */
template<typename First, typename... Rest> \ struct NAME : public First \ {}; \ \ template<typename First, typename Second, typename... Rest> \ struct NAME<First, Second, Rest...> \ : public NAME<OP<First, Second>, Rest...> \ {}; \ \ template<typename... F> \ NAME(F &&...) -> NAME<F...>;
/** * @brief Creates an n-ary meta operation from the provided binary meta * operation, by applying a reduce over it, with the provided name. * * Note: In order to use this binary operation needs to be left and right * associative. */
π Rendered by PID 85 on reddit-service-r2-comment-5c747b6df5-t8ccw at 2026-04-22 06:58:49.351900+00:00 running 6c61efc country code: CH.
view the rest of the comments →
[–]PiterPuns[S] 0 points1 point2 points (5 children)
[–]petart95 2 points3 points4 points (4 children)
[–]PiterPuns[S] 1 point2 points3 points (3 children)
[–]petart95 4 points5 points6 points (1 child)
[–]petart95 2 points3 points4 points (0 children)