Is it possible to make this code work as I'd like? I.e. to allow the concept to have access to a private member funcion?
template <typename T>
concept bool Writeable()
{ return requires (T x,std::ostream os) { { x.Write(os) } -> void }; }
template <Writeable T>
void Write(std::ostream &os,const T &x) { x.Write(os); }
class TT
{
private:
void Write(std::ostream &os) const { os << "foo"; }
//friend concept bool Writeable<TT>();
friend void ::Write<TT>(std::ostream &,const TT &);
};
Thanks
No. Concepts explicitly are not allowed to be friends.
n4377 7.1.7/2
We can reduce it to this example to show that the access really is the problem:
You can however use a level of indirection, something like this:
Live demo incorporating your example
Which works. Concepts are pretty early, so I imagine down the line that they might lift the
friend
restriction just as proposals have lifted restrictions for C++11/14 features in the past.