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
mailto:boost-users@lists.boost.org> 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*/