【发布时间】:2012-06-07 00:37:09
【问题描述】:
假设我有这样的课程:
class Foo
{
std::vector<int> bar;
public:
std::vector<int>& get_bar() { return bar; }
};
稍后,我想要另一个与bar 具有相同类型的变量。如果我能做到这一点,那对我来说很有意义:
decltype(Foo::bar) clone_of_bar;
但这不起作用。编译器告诉我 'std::vector Foo::bar' 是私有的。
所以我最终不得不使用这样的东西:
std::remove_reference<decltype(std::declval<Foo>().get_bar())>::type clone_of_bar;
这可行,但看起来一团糟。也许有更简单的方法来做到这一点;我不太确定。但我真正想知道的是为什么我不能只使用decltype(Foo::bar)。为什么有人要关心bar 是私人的?我实际上并没有访问该变量。
decltype 是该语言的一个新特性。我只是不明白为什么它被设计成不能处理私有变量。
【问题讨论】:
-
如果您能给我们一些 实际 示例,您将受益于在私人成员上使用 decltype,我将不胜感激。
-
嗯,我有任何非常充分的理由想要这样做。这主要是出于好奇。但是我尝试使用它的情况是这样的:我使用的是 google protobuf,为此我定义了一些事件类型,然后 protobuf 为这些类型生成了一些代码。生成的代码看起来有点像我在问题示例中写的。问题是,我希望能够从 protobuf 消息中复制一些数据来做一些事情,如果我碰巧更改了 protobuf 消息中的类型,我不想更改代码。所以这就是我想做的。不过没什么大不了的。
-
你不能只使用“auto x = somefoo.get_bar();” ?你会复制,但没有明确提供“x”的类型。
-
我不能使用自动,因为副本是某个类的永久成员。基本上我有一个存储“状态”的类,这些 protobuf 消息包含状态的新点点滴滴。所以当一个protobuf消息进来时,我想摆脱旧状态的一部分并用新的替换它。 -- 所以无论如何,我不能使用auto,因为我必须在调用get_bar之前声明类型。
-
+1 我实际上有一个真实的例子,这是一个可验证的 PITA。 stackoverflow.com/q/14934749/975129 我必须使用
decltype,因为可变参数函数将根据传入的参数返回不同的类型。作为一个邪恶的结果,我必须在我的at()方法中公开我的m_map成员? !?啊!我可能不得不使用你的解决方法,但是我必须添加一个不必要的get方法..