别名定义来自私有子结构的静态成员
Alias the definition of a static member from a private sub-struct
背景
我有一个 private
数据结构隐藏在许多嵌套的命名空间和 类 中,如下面的(简化)示例所示。 private
结构包含许多 static const
成员(主要是冗长的 STL 容器),在此示例中由单个 static const int i
.
表示
注意:这里的 const
似乎与我的问题无关;包含它只是为了完整起见。
#include <iostream>
using std::cout; using std::endl;
namespace foo {
namespace bar {
class MyClass {
struct Data {
static const int i;
// ... + many more
};
public:
int Get() const { return Data::i; }
};
}
}
/////////////////////////////////////////////////////////////////////////////
const int foo::bar::MyClass::Data::i = 42; // [A] <- Verbose; but works fine
// ... + many more // [A]
//using concise = foo::bar::MyClass::Data; // [B] <- Nope; 'Data' is private
//const int concise::i = 42; // [B] <- Ideally
//// ... + many more // [B]
/////////////////////////////////////////////////////////////////////////////
int main()
{
cout << foo::bar::MyClass{}.Get() << endl;
return 0;
}
需要
在其数据结构之外定义诸如 i
之类的静态成员是微不足道的(参见 [A]
)。但是,随着成员层次结构中 namespaces/classes/structs 数量的增加, 缩写层次结构 变得可取(chain/tree/prefix?) 在成员的定义中为了可读性。
想象一下,需要像下面这样的东西,多次:
const std::vector<std::string> foo::bar::baz::MyClass::MySubClass::MySubSubClass::PrivateDataStruct::vecOfStr = {…};
在某些时候,为了编码人员的理智,他们会希望缩短此操作的语法。
问题
我天真的尝试(参见 [B]
)通过 using
指令为 i
定义别名并没有像预期的那样起作用 由于 Data
结构为 private
。交换代码块 [B]
为 [A]
产量(in VS2017):
error C2248: 'foo::bar::MyClass::Data': cannot access private struct declared in class 'foo::bar::MyClass'
Ideone (gcc?) 在 [B]
:
处导致类似的错误
error: ‘struct foo::bar::MyClass::Data’ is private within this context
问题
- 为什么
[B]
不起作用 ,而 [A]
起作用?
- 我如何定义
i
及其层次结构 chain/tree/prefix 别名 (最好通过 using
)?
- 奖励: 在引用成员时,我一直称之为 namespace/class/structure 层次结构 chain/tree/prefix 的首选命名法是什么?
其他问题(例如 )与我的问题很相似,但似乎不相关。
请随时通过任何修改或建议来改进此问题。
Why doesn't [B] work, while [A] does?
private
stuff (class/member name) 只能在几个地方使用,包括定义(即 [A])但不能使用别名(在不允许使用类型的范围内)
How might I define i
with its hierarchy chain/tree/prefix aliased (preferably via using)?
Bonus: What is the preferred nomenclature for what I've been calling the namespace/class/structure hierarchy chain/tree/prefix when referencing a member?
您仍然可以缩短命名空间部分:
using namespace foo::bar;
const int MyClass::Data::i = 42;
而对于 class 部分,您仍然可以在父 class 中添加一些使用,如果可以的话:
class MyClass {
class MySubClass{
friend class MyClass;
class MySubSubClass{
friend class MyClass;
class PrivateDataStruct {
static const std::vector<std::string> vecOfStr;
// ...
};
// ...
};
// ...
};
using inner = MySubClass::MySubSubClass::PrivateDataStruct;
public:
// ...
};
最后:
const std::vector<std::string>
foo::bar::baz::MyClass::MySubClass::MySubSubClass::PrivateDataStruct::vecOfStr = {/*…*/};
变成:
using namespace foo::bar::baz;
const std::vector<std::string> MyClass::inner::vecOfStr = {/*…*/};
背景
我有一个 private
数据结构隐藏在许多嵌套的命名空间和 类 中,如下面的(简化)示例所示。 private
结构包含许多 static const
成员(主要是冗长的 STL 容器),在此示例中由单个 static const int i
.
注意:这里的 const
似乎与我的问题无关;包含它只是为了完整起见。
#include <iostream>
using std::cout; using std::endl;
namespace foo {
namespace bar {
class MyClass {
struct Data {
static const int i;
// ... + many more
};
public:
int Get() const { return Data::i; }
};
}
}
/////////////////////////////////////////////////////////////////////////////
const int foo::bar::MyClass::Data::i = 42; // [A] <- Verbose; but works fine
// ... + many more // [A]
//using concise = foo::bar::MyClass::Data; // [B] <- Nope; 'Data' is private
//const int concise::i = 42; // [B] <- Ideally
//// ... + many more // [B]
/////////////////////////////////////////////////////////////////////////////
int main()
{
cout << foo::bar::MyClass{}.Get() << endl;
return 0;
}
需要
在其数据结构之外定义诸如 i
之类的静态成员是微不足道的(参见 [A]
)。但是,随着成员层次结构中 namespaces/classes/structs 数量的增加, 缩写层次结构 变得可取(chain/tree/prefix?) 在成员的定义中为了可读性。
想象一下,需要像下面这样的东西,多次:
const std::vector<std::string> foo::bar::baz::MyClass::MySubClass::MySubSubClass::PrivateDataStruct::vecOfStr = {…};
在某些时候,为了编码人员的理智,他们会希望缩短此操作的语法。
问题
我天真的尝试(参见 [B]
)通过 using
指令为 i
定义别名并没有像预期的那样起作用 由于 Data
结构为 private
。交换代码块 [B]
为 [A]
产量(in VS2017):
error C2248: 'foo::bar::MyClass::Data': cannot access private struct declared in class 'foo::bar::MyClass'
Ideone (gcc?) 在 [B]
:
error: ‘struct foo::bar::MyClass::Data’ is private within this context
问题
- 为什么
[B]
不起作用 ,而[A]
起作用? - 我如何定义
i
及其层次结构 chain/tree/prefix 别名 (最好通过using
)? - 奖励: 在引用成员时,我一直称之为 namespace/class/structure 层次结构 chain/tree/prefix 的首选命名法是什么?
其他问题(例如
请随时通过任何修改或建议来改进此问题。
Why doesn't [B] work, while [A] does?
private
stuff (class/member name) 只能在几个地方使用,包括定义(即 [A])但不能使用别名(在不允许使用类型的范围内)
How might I define
i
with its hierarchy chain/tree/prefix aliased (preferably via using)? Bonus: What is the preferred nomenclature for what I've been calling the namespace/class/structure hierarchy chain/tree/prefix when referencing a member?
您仍然可以缩短命名空间部分:
using namespace foo::bar;
const int MyClass::Data::i = 42;
而对于 class 部分,您仍然可以在父 class 中添加一些使用,如果可以的话:
class MyClass {
class MySubClass{
friend class MyClass;
class MySubSubClass{
friend class MyClass;
class PrivateDataStruct {
static const std::vector<std::string> vecOfStr;
// ...
};
// ...
};
// ...
};
using inner = MySubClass::MySubSubClass::PrivateDataStruct;
public:
// ...
};
最后:
const std::vector<std::string>
foo::bar::baz::MyClass::MySubClass::MySubSubClass::PrivateDataStruct::vecOfStr = {/*…*/};
变成:
using namespace foo::bar::baz;
const std::vector<std::string> MyClass::inner::vecOfStr = {/*…*/};