如何在私有类成员上使用 decltype?
How to use decltype on private class-members?
我有一个类,里面有一些"毛茸茸"的私人字段。每个都有访问器函数(getter 和 setter(。
private:
array<double, 9> foo;
public:
const array<double, 9> & getFoo() const { return foo; }
void setFoo(const array<double, 9> & _foo) { foo = _foo; }
我真的不想在其他地方重复array<double, 9>
- 使用decltype
来指代字段的类型,无论它是什么。
不幸的是,简单地调用decltype(instance.foo)
在类外不起作用,因为foo
是私有的。
幸运的是,decltype(getFoo())
几乎有效 -getFoo
是公开的,必须具有相同的类型。
不幸的是,上面的"几乎"还不够好——getFoo
的类型实际上是一个参考(array<double, 9> &
(。
如何在类外部的代码中获取实际类型,以便我可以调用 setter 函数:
SOMETHING values;
for (auto &i : values)
i = something();
instance.setFoo(values);
使用类型别名。
class Foo
{
public:
using array_t = std::array<double, 9>;
private:
array_t foo;
public:
const array_t & getFoo() const { return foo; }
void setFoo(const array_t & _foo) { foo = _foo; }
};
允许您将类型提供给用户,并允许您不必键入std::array<double, 9>
。 您还可以获得只能在一个地方更改类型的好处。
在外部代码中,您可以声明类成员类型的变量,例如
Foo::array_t bar;
您可以将decltype
与类型修饰符一起使用:
std::decay_t<decltype(instance.getFoo())> values; // std::array<double, 9>
for (auto &i : values)
i = something();
instance.setFoo(values);
你的代码几乎没有上下文,但通常你只会根据它们的含义来命名事物,例如:
struct my_image {
typedef std::array<int,900> raw_image_t;
const raw_image_t& get_raw(){ return data;}
private:
raw_image_t data;
};
现在用户可以写入
my_image::raw_image_t x = f.get_raw();
相关文章:
- decltype:使用指针访问类的静态成员
- 非静态成员函数的 decltype 格式不正确吗?
- 如何在私有类成员上使用 decltype?
- 为什么在 ctor 的参数列表中将成员"x"的类型替换为"decltype(x)"会破坏类模板参数推导?
- 具体化 PRVALUES 成员访问的 decltype 行为不正确
- 如何使用非尾随 decltype 返回类型定义行外类模板成员函数
- 在非常量成员函数中,为什么点这个非常量,而 decltype 指针这是常量
- decltype 不会推断 const 对象的 const 成员
- 静态断言 std::array 的大小,其类型是使用 decltype 从成员函数的返回值中获取的
- 在 C++14 中使用 decltype(auto) 声明静态数据成员
- GCC 中的编译器错误,但在将 decltype 与具有尾随返回类型语法的模板化成员函数一起使用时没有 clang
- C++11 个 decltype 和数据成员
- 如何将 decltype 应用于运算符 [] 声明中的成员函数
- 类成员函数的 decltype
- 在声明后对成员函数定义使用decltype
- 成员函数中的decltype(auto)忽略无效的正文,declttype(expr)失败
- SFINAE 使用 decltype 检查静态成员
- 使用decltype和constness的C++11尾部返回成员函数
- decltype 和成员函数(非指针)类型
- 将 decltype 与虚拟成员函数指针一起使用