假设我有两个模板类.
template<class T>
class baseclass1
{
template<class> friend class baseclass2;
}
template<class D>
class baseclass2
{
template<class T> void foo( D& x, T& y)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码允许所有类型的baseclass1友好所有类型baseclass2,多对多关系.我有两个问题,
允许baseclass1只是函数的朋友是什么语法
baseclass2<class D>::foo<class T>( D& x, T& y).
Run Code Online (Sandbox Code Playgroud)
而且,允许baseclass1朋友只使用该函数的语法是什么
baseclass2<class D>::foo<class T>( D& x, T& y)其中Tfrom baseclass1匹配T来自函数foo.
编辑
对于那些一直声称你不能成为模板专业化的朋友.这段代码有效
template<class cake>
class foo
{
public:
static void bar(cake x)
{
cout << x.x;
}
};
class pie
{
public: …Run Code Online (Sandbox Code Playgroud) 我想知道C++ 0x是否提供了任何内置功能来检查可变参数模板的参数包是否包含特定类型.今天,如果你使用boost :: mpl :: vector作为variadic模板的替代品,可以用boost ::: mpl :: contains来实现这个目的.但是,它有严重的编译时间开销.我想,C++ 0x对std :: is_same有编译器级支持.所以我在想是否在编译器中也支持如下的泛化.
template <typename... Args, typename What>
struct is_present
{
enum { value = (What in Args...)? 1 : 0 };
};
Run Code Online (Sandbox Code Playgroud) 为模板参数提供参与是不可能的,因为标准不允许这样做.那我怎么能有效地做同样的事呢?
我想要的基本上是一种在拥有它的对象之外无法使用的类型.为什么不是重点,但如果你真的必须知道,我正在尝试制定一套智能指针来解决共享自有资源的问题.因此,我想要做的就是这样,如果它有效:
template < typename T, typename Owner >
struct accessible_member
{
private:
accessible_member() : val(T()) {}
accessible_member(T const& t) : val(t) {}
operator T& () { return val; }
operator T const& () const { return val; }
member_ptr<T> operator & () { return member_ptr<T>(val); }
friend class Owner;
};
Run Code Online (Sandbox Code Playgroud)
因此,一个类不能将该对象保存为成员,除非它声明自己是所有者,并且如果它足够愚蠢地按原样公开它,那么在类之外使用这么愚蠢是不可能的.
我见过一个CRTP解决方案,它将接口提取到基类中,并且只为每个基类提供一个包参数.然后,派生程度最高的类继承了所有friended基类并实现了接口.
我不能使用这种方法,因为我需要保护赋值运算符,它不是继承的.
此外,由于赋值运算符具有仅具有一个参数的已定义签名,因此我无法使用密钥模式.
这就是我想要的:
template <typename... F>
struct A {
protected:
A& operator=(const SomeClass &other) {
//...
}
private:
//I would like to do the following, but it does not work
friend F...;
}
Run Code Online (Sandbox Code Playgroud)
有办法做我需要的吗?
我有class A和class B.我想class A访问其中一个class B私有函数; 但只有这一点,而不是其他一切.那可能吗?
某种例子:
class A {
//stuff
};
class B {
int r; // A cant use this
MagicFriendKeyword A void func(); // A can use this
public:
...
};
Run Code Online (Sandbox Code Playgroud) 我想要一个类型A,它将隐藏的数据输出到类型为T的对象,但是隐藏其他人的数据.我的C++编译器碰巧是GCC 4.4,但这并不重要.为什么这不起作用?
#include <iostream>
template <class T> class A {
private:
int n1;
public:
friend class T;
A(const int n0 = 0) : n1(n0) {}
};
class B {
public:
int f(const A<B> a) const { return a.n1; }
B() {}
};
int main() {
const A<B> a(5);
const B b;
const int m = b.f(a);
std::cout << m << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
顺便说一下,这样可以正常工作,除了它无法隐藏数据:
#include <iostream>
template <class T> class A {
private:
int n1; …Run Code Online (Sandbox Code Playgroud) 我想仅在某些(编译时)条件为真时才声明友元类.例如:
// pseudo-C++
class Foo {
if(some_compile_time_condition) {
friend class Bar;
}
};
Run Code Online (Sandbox Code Playgroud)
我没有在互联网上找到任何解决方案.我在编译时动态地完成了生成结构问题的所有答案.他们中的许多人使用C++ 11 std::conditional,但我想知道是否可以在不使用预处理器的情况下在C++ 03中执行此操作.
此解决方案/sf/answers/796369731/将无法工作,因为friend未继承船舶(具有继承的朋友类).
编辑只是为了使这更容易看到,如下面评论中所述:此要求不常见.这是我正在研究的硬件模拟新研究项目的一部分.测试平台是用C++编写的,我想在波形中显示变量.我已经研究了各种其他选项,并且friend class由于实际考虑,我发现我需要使用a .朋友将捕获值并生成波形,但我更愿意仅在需要波形时才拥有朋友,而不是所有时间.
我目前正在尝试确保一个类的成员函数仅由另一个类的成员函数调用.
该架构是强加的,不能改变,端口意味着必须在a.call()调用之前完成一些逻辑b.call().a.call()因此要求b.call()简化事情并确保订单得到尊重.
我找到了这个问题的答案.唯一的问题是我正在使用类,并且这两个类具有相同的成员函数名称,因此#define尝试替换具有不同原型的所有实例.
我有一个备份的数据副本,我想保护,所以我做了const.我需要const在两个场合违反这个问题,一次将原始数据存储到它:
fgBlocks.CopyInto((BlkArray&)backUpCopy);
Run Code Online (Sandbox Code Playgroud)
WRT
result CopyInto(BlkArray &replica) const {/**/}
Run Code Online (Sandbox Code Playgroud)
当我调用RemoveAll()它时,这是一个非const方法:
((BlkArray)backUpCopy).RemoveAll(true);
Run Code Online (Sandbox Code Playgroud)
第一个演员(如上所示(BlkArray&))是否正确?这是间接的一个方面,我现在还没有.然后,我将再添加一个未使用的方面,即抛弃const用于调用对象方法的方法,编译器不接受如上所示的方法.
成员声明如下:
BlkArray fgBlocks;
const BlkArray backUpCopy;
Run Code Online (Sandbox Code Playgroud)
我正在尝试扩展Correa的解决方案,所以:
BlkArray *pBUCopy = (BlkArray *)&backUpCopy;
fgBlocks.CopyInto(*pBUCopy);
Run Code Online (Sandbox Code Playgroud)
现在唯一的问题是编译器由于失败而失败
未初始化的成员'MyClass :: backUpCopy'与'const'类型'const BlockArray'
背景:我正在为一个不是我编写的C库编写C++包装器接口.我的包装类模仿了库结构,在这个库中,有些成员struct b指向了成员struct a.该库的文档说:"不要销毁struct a之前的变量struct b." 实际上应该允许这样的情况,所以我想在代码中更好地处理这种情况.因此,在我的包装器中,如果class A有一个或多个class B指向它的实例的实例在B的所有实例之前被销毁,我想将数据从A复制到B的每个实例.目前,我用公共处理这个成员函数,如下:
// some code shortened or not shown
struct a {
int d; // in reality, data is much more complicated
};
struct b {
int* d;
};
class B;
class A {
struct a a_;
vector<B*> registered_bs_; // should probably use unordered_set
public:
~A(void) { for (iterator it: registered_bs_) (*it)->copyA(); } // C++0x for
void registerB(B* b) { registered_bs_.push_back(b); } …Run Code Online (Sandbox Code Playgroud) 据我所知,C++中只有3个访问说明符:私有,公共,受保护
与这些3访问说明符,我怎样才能使一个方法可用到的类中的项目,但不能使用于"外国人" ??(如内部和公共在C#)