Wie viele Pack-Expansions schafft ihr in einem Ausdruck?



  • Huhu,

    Beim Implementieren meiner Lambda-Lib hab ich mich gefragt, ob ihr das überbieten könnt? 🤡

    template <unsigned... I, typename... Args>
    auto impl(detail::indices<I...>, Args&&... args) const
    	-> decltype((std::declval<Object>()(std::forward<Args>(args)...)->*std::declval<Member>()(std::forward<Args>(args)...))(std::get<I>(std::declval<std::tuple<Expr...>>())(std::forward<Args>(args)...)...)) // ...
    {
    	return (object(std::forward<Args>(args)...)->*member(std::forward<Args>(args)...))(std::get<I>(expr)(std::forward<Args>(args)...)...);
    }
    

    Der Rückgabetyp hat 5, das return 4 Expansions.

    Grüßle,
    PI



  • First I was like 😮 , but then I saw the comment. 💡 👍



  • Wieso eine Lambda Library wenn du C++11 hast?



  • Weil C++11 Lambdas nicht polymorph und umständlich zu schreiben sind.



  • Three-Star-Programmer.
    Oder Three-Dot-Programmer?
    ich finde beides gruseligst unwartbar.



  • Schreibs besser 😉



  • ich bin mir nicht mal sicher, was das Ding überhaupt machen soll.

    //edit ich vermute, dass sich die Situation schon deutlichst vereinfachen würde, wenn du

    object(std::forward<Args>(args)...)->*member(std::forward<Args>(args)...)
    

    eine eigene Funktion spendieren würdest.



  • otze schrieb:

    ich bin mir nicht mal sicher, was das Ding überhaupt machen soll.

    Na das sieht man doch direkt am sprechenden Funktionsnamen.



  • otze schrieb:

    //edit ich vermute, dass sich die Situation schon deutlichst vereinfachen würde, wenn du

    object(std::forward<Args>(args)...)->*member(std::forward<Args>(args)...)
    

    eine eigene Funktion spendieren würdest.

    Geht nicht, das Ding ist der Aufruf einer Member-Funktion mit Argumenten. Also (object.*member)(args...);

    Das Ding repräsentiert genau so einen Ausdruck in einer Lambda.

    template <typename Object, typename Member, typename... Expr>
    	struct pointer_to_member_function_call_expression : expression<pointer_to_member_function_call_expression<Object, Member, Expr...>>
    	{
    		pointer_to_member_function_call_expression(Object object, Member member, Expr... expr)
    			: object(object), member(member), expr{ expr... }
    		{}
    
    	private:
    		template <unsigned... I, typename... Args>
    		auto impl(detail::indices<I...>, Args&&... args) const
    			-> decltype((std::declval<Object>()(std::forward<Args>(args)...)->*std::declval<Member>()(std::forward<Args>(args)...))(std::get<I>(std::declval<std::tuple<Expr...>>())(std::forward<Args>(args)...)...)) // ...
    		{
    			return (object(std::forward<Args>(args)...)->*member(std::forward<Args>(args)...))(std::get<I>(expr)(std::forward<Args>(args)...)...);
    		}
    
    	public:
    		template <typename... Args>
    		auto operator () (Args&&... args) const
    			-> decltype(this->impl(typename detail::make_indices<sizeof...(Expr)>::type(), std::forward<Args>(args)...))
    		{
    			return impl(typename detail::make_indices<sizeof...(Expr)>::type(), std::forward<Args>(args)...);
    		}
    
    	private:
    		Object const object;
    		Member const member;
    		std::tuple<Expr...> const expr;
    	};
    

    Bin mal gespannt, wie ihr das schöner löst 🤡



  • ich weiß schon warum ich bei c bleib, da gibts keine lambdas deren nutzen mir eh schleierhaft ist. 🙄



  • Ich weiß schon, warum ich bei C++ bleibe, da gibts wenigstens Abstraktion.



  • wo ist der abstraktions unterschied zwischen einer anonymen und einer 'benannten' funktion 😕

    dass die benannten langweilig sind, weiß ich schon und als ich von js zu c kam, hab ich es auch vermisst aber man gewöhnt sich dran und nach einiger zeit, dachte ich mir, dass es eig. total stupide ist, funkionskörper ständig neu zu schreiben 😉



  • klimbim schrieb:

    wo ist der abstraktions unterschied zwischen einer anonymen und einer 'benannten' funktion 😕

    Nirgens. Du hast dir ein dummes Argument für C gesucht, ich mir (mit Absicht) ein noch viel dümmeres für C++.



  • Ich seh schon wohin das führt. Wenn hier nichts sinvolles mehr kommt mach ich zu, bevor das hier zum (n+1)ten Flamewar eskaliert.



  • pumuckl schrieb:

    Ich seh schon wohin das führt.

    Du siehst das falsch. Ich habe einem Falmewar vorgebeut, indem ich noch viel größeren Mist gepostet habe. Das funktioniert wirklich 🤡

    pumuckl schrieb:

    Wenn hier nichts sinvolles mehr kommt mach ich zu, bevor das hier zum (n+1)ten Flamewar eskaliert.

    Mir wäre lieber, du würdest die Posts einfach löschen.


Anmelden zum Antworten