gpt4 book ai didi

c++ - 在构造期间是否有一种简洁的方法来派生成员的类型?

转载 作者:搜寻专家 更新时间:2023-10-31 00:39:10 24 4
gpt4 key购买 nike

我有:

  • 模板例程 unarchive它采用字典和键并基于传递的模板类型 ( T ) 可以专门生成 T
  • struct 的构造函数利用 unarchive构建其成员

一个例子可能如下:

template <typename T>
T unarchive(const dictionary_t&, key_type key);

struct foo
{
foo(const dictionary& archive) :
value_m(unarchive<decltype(value_m)>(archive, value_key))
{ }

some_value_type value_m;
};

使用 unarchive<decltype(value_m)> 的优势这是我可以更改 value_m 的类型无需更新这行代码 - 类型始终遵循成员变量的类型。

我遇到的问题更美观:它非常冗长。目前我有一个宏:

#define UNARCHIVE_FOR(var) unarchive<decltype(var)>

还有 foo的构造函数更改如下:

foo(const dictionary& archive) :
value_m(UNARCHIVE_FOR(value_m)(archive, value_key))
{ }

现在我得到了一个更简洁但更丑陋的结果。不用宏也能达到同样的效果吗?我想要的是类似于:

foo(const dictionary& archive) :
value_m(unarchive<value_m>(archive, value_key))
{ }

如何做到这一点?

最佳答案

The advantage of using unarchive here is that I can change the type of value_m without having to update this line of code - the type always follows the member variable's type.

一种替代方法是为 value_m 的类型创建一个别名并消除 decltype(value_m)来自构造函数初始化列表:

struct foo
{
using value_type = int;

foo(const dictionary_t& archive, const key_type value_key) :
value_m(unarchive<value_type>(archive, value_key))
{ }

value_type value_m;
};

unarchive<value_type>仍然遵循 value_m 的类型. static_assert可以添加以确保 value_m 的类型与value_type相同如果担心 value_m 的类型发生变化通过不改变 value_type :

static_assert(std::is_same<decltype(value_m), value_type>::value,
"'value_m' type differs from 'value_type'");

或者根据value_m的类型设置别名:

int value_m;
using value_type = decltype(value_m);

如果您仍然认为构造函数初始化列表冗长,请提供 static调用 unarchive() 的包装函数功能:

struct foo
{
using value_type = int;

foo(const dictionary_t& archive, const key_type value_key) :
value_m(unarchive_(archive, value_key))
{ }

static value_type unarchive_(const dictionary_t& d, key_type k)
{
return unarchive<value_type>(d, k);
}

value_type value_m;
};

说了这么多:

value_m(unarchive<decltype(value_m)>(archive, value_key))

不是那么冗长,而是准确地表达了意图。

关于c++ - 在构造期间是否有一种简洁的方法来派生成员的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16684080/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com