On Wednesday, 9 September 2015 at 20:19:44 UTC, Daniel N wrote:
For the record, I think D made the right decision... omitting
friends.
However there's one case in particular which I find useful,
anyone see a good workaround for this?
#include <memory>
class Friendly
{
private:
int val;
Friendly(int&& val) : val(val) {}
friend std::unique_ptr<Friendly>
std::make_unique<Friendly>(int&& val);
};
int main()
{
auto yay = std::make_unique<Friendly>(1);
auto nay = new Friendly(1);
}
How about using a mixin
template(http://dlang.org/template-mixin.html)?
module makeunique;
mixin template MakeUnique(Args...)
{
import std.typecons : Unique;
static Unique!(typeof(this)) makeUnique(Args args)
{
return Unique!Friendly(new typeof(this)(args));
}
}
module friendly;
import makeunique;
struct Friendly
{
private:
int val;
this(int val)
{
this.val = val;
}
public:
mixin MakeUnique!(int);
};
module app;
import std.stdio;
import std.typecons;
import friendly;
void main()
{
auto yay = Friendly.makeUnique(1);
}