【发布时间】:2013-05-22 05:26:20
【问题描述】:
我有:
- 模板例程
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))
{ }
如何做到这一点?
【问题讨论】:
-
为什么不
unarchive(m,archive,value_key)? -
参数类型推导呢?
unarchive(value_m, archive, value_key)- 您还可以提供适配器功能,例如作为静态成员。 -
我想过这一点,但该变量当时尚未完全构造,因此不想给人留下任何印象,即该变量实际上会在例程中使用 - 我想传递它作为模板参数,以强调它的类型是被派生的。
-
@fbrereto 在这种情况下,
decltype在 IMO 中表现得非常清晰和富有表现力。 -
unarchive(&value_m,archive,value_key)然后。
标签: c++ c++11 constructor decltype type-deduction