Boost logo

Boost Users :

Subject: Re: [Boost-users] function template with a universal reference to a specific type
From: Ireneusz Szcześniak (irek.szczesniak_at_[hidden])
Date: 2018-12-31 08:00:32


Hi degski,

Thank you for your email, but you missed the point of my email.
Please note that in the foo function I'm not using parameter t, so the
use of the forwarding (universal) reference cannot be inappropriate.

Best,
Irek

On 31.12.2018 07:09, degski wrote:
> On Sun, 30 Dec 2018 at 17:05, Ireneusz Szcześniak via Boost-users
> <boost-users_at_[hidden] <mailto:boost-users_at_[hidden]>> wrote:
>
> I'm writing to ask a C++ question, not specifically Boost-related,
> but
> this list is the best place I know.
>
>
> A better place would be https://www.reddit.com/r/cpp_questions/
> [relatively informal] or https://stackoverflow.com/ [more formal,
> requirement for good formulation of your problem].
>
> How can I write a function template, which has a parameter of the
> universal reference to a specific type?
>
> I can write a function template like this:
>
> template <typename T>
> void
> foo(T &&t)
> {
>    // The primary template implementation.
>    cout << "Primary: " << __PRETTY_FUNCTION__ << endl;
> }
>
>
> You have to read up on universal references
> [https://en.cppreference.com/w/cpp/language/reference] as in the above
> a UR seems in-appropriate, as printing in general should [normally]
> not involve "consuming" [i.e. move] the value your printing. It's
> saves typing but "using namespace std;" will, once you get bigger
> projects, give you [potentially] grief, it's advisable to just type
> std:: everywhere. If there are really long [and several nested
> namespaces] you can just write a short-cut, like so
>
> namespace fs = std::filesystem;
>
> And so I can call this function with an expression of any value
> category, and any type, cv-qualified or not, like this:
>
> int
> main()
> {
>    foo(1);
>    int i = 1;
>    foo(i);
>    const int ci = 1;
>    foo(ci);
> }
>
> In my code I need to provide different implementations of foo for
> different types (and these types are templated).  How can I
> accomplish
> that?
>
>
> You can simply overload the <<-operator for the types you need.
>
> Like [just copied some code as an example]:
>
> template<typename Stream>
> [[ maybe_unused ]] Stream & operator << ( Stream & out_, const point2f
> & p_ ) noexcept {
>     out_ << '<' << p_.x << ' ' << p_.y << '>';
>     return out_;
> }
>
> after which you can just write:
>
> point2f p { 1.2f, 5.6f };
> std::cout << p << '\n';
>
> The nice thing [of the above] is that it [your overload] will also
> work with other stream-types [https://en.cppreference.com/w/cpp/io].
>
> degski
> --
> /*/*“*/If something cannot go on forever, it will stop" - Herbert Stein*/


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net