C ++概念与朋友
是否有可能让这段代码正常工作? 也就是说让概念能够访问私有成员函数?
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 &);
};
谢谢
否。显然,概念不允许成为朋友。
n4377 7.1.7 / 2
每个概念定义都被隐式定义为一个constexpr声明(7.1.5)。 概念定义不应与thread_local,inline,friend或constexpr说明符一起声明,概念定义也不应有相关的约束(14.10.2)。
我们可以将它缩小到这个例子来表明访问真的是问题:
template <typename T>
concept bool Fooable = requires (T t) { { t.f() } -> void };
struct Foo
{
private:
void f() {}
};
int main()
{
static_assert(Fooable<Foo>, "Fails if private");
}
但是,您可以使用间接级别,如下所示:
template <typename T>
void bar(T t) { t.f(); }
template <typename T>
concept bool FooableFriend = requires(T t) { { bar(t) } -> void };
struct Foo
{
private:
void f() {}
template<typename T>
friend void bar(T t);
};
int main()
{
static_assert(FooableFriend<Foo>, "");
}
结合您的示例的现场演示
哪些工作。 概念是相当早的,所以我想象下来他们可能会解除friend
限制,正如提案在过去取消了对C ++ 11/14功能的限制。
下一篇: jQuery: css margin based on the amount of elements in container?