元函数使用 decltype 返回元素类型

Metafunction returning element type using decltype

本文关键字:返回 元素 类型 decltype 函数      更新时间:2023-10-16

我有以下MWE:

#include <memory>
template<typename T>
class Foo
{
public:
using message_type = T;
};
int main()
{
std::shared_ptr<Foo<int>> ptr;
decltype(ptr)::element_type::message_type number = 5;
return 0;
}

并且我希望有一种速记方法来访问变量的message_type类型(例如ptr(,而不必写出整个decltype(ptr)::element_type::message_type部分。 即有一些别名可以沿着message_type(ptr)的谎言decltype(ptr)::element_type::message_type,这将具有相同的结果。

我的第一个想法是沿着

template<typename T>
using message_type = decltype(T)::element_type::message_type;

乍一看似乎合乎逻辑,但它实际上是混合了类型和变量的概念,因此它甚至没有编译。到目前为止,我唯一有效的解决方案是

#define MSG_TYPE(x) decltype(x)::element_type::message_type

但是我想避免使用宏。

这在当前的C++元编程中可能吗?如果是这样,正确的语法是什么?

这有效:

#include <memory>
template<typename T>
using message_type = typename T::element_type::message_type;
template<typename T>
class Foo
{
public:
using message_type = T;
};
int main()
{
std::shared_ptr<Foo<int>> ptr;
message_type<decltype(ptr)> number = 5;
return 0;
}

我认为你不能做得更好,因为你不允许将std::shared_ptr用作非类型模板参数,所以你必须做message_type<decltype(ptr)>message_type<ptr>(还(不可能实现。