【发布时间】:2021-01-17 05:02:23
【问题描述】:
假设我们创建两个返回std::type_identity、like的type_of函数:
template<auto VAR>
auto type_of() {
return std::type_identity<decltype(VAR)>{};
}
template<typename T>
auto type_of() {
return std::type_identity<T>{};
}
从std::type_identity获取实际类型的方式似乎有点麻烦:
// this works
// both i1 and i2 are ints
decltype(type_of<int>())::type i1;
decltype(type_of<int{}>())::type i2;
有没有办法在上面的表达式中放弃对decltype 的需要,或者将它放在一个可重用的表达式中,以实现更好的效果,例如:
// can this work?
type_of<int>()::type i1;
type_of<int{}>()::type i2;
甚至更好:
// can this work??
type_of_t<int> i1;
type_of_t<int{}> i2;
注意:类型和非类型模板参数的特化,可能是一个方向,不起作用(无法编译):
template<auto>
struct type_of;
template<typename T>
struct type_of<T> { // <== compilation error: type/value mismatch
using type = T;
};
template<auto VAR>
struct type_of<VAR> {
using type = decltype(VAR);
};
【问题讨论】:
-
你想达到什么目的?如果您知道
T是一个类型,只需使用T i1来创建该类型的变量。如果你知道t是一个变量,只需使用decltype(t) i2创建一个相同类型的变量。 -
type_of函数可以返回任何类型。type_of的实现只是最简单的例子。 -
像你一样使用 type_identity 是 0 点。只需为您尝试传输的类型使用类型别名。当您真正想要的是传递 int 类型时,为什么要传递 int 的 type_identity?对我来说毫无意义。换句话说:不要使用不需要的东西。许多 C++ 库是“按需提供”的,只有在您明确需要时才应使用。在这里,我根本看不到任何需要。这就像有人阅读了设计模式并试图为所有事情选择一种,结果却是企业的混乱结果。
-
如果你想返回一个类型,你为什么要使用根据定义返回对象的函数?在 C++ 中,类型是从相当于元函数的东西返回的,并且如您所见,存在阻抗不匹配,而 type_identity 和类似的解决方案并不能解决这个问题。考虑到语言的现状,这不是一个可以解决的问题——直到类型成为一等值。一旦语言允许将类型作为值返回,然后在需要类型的地方使用这些值,问题就会得到解决。到目前为止,只有元函数的使用负担会更小,因为它们本身就是类型。
-
你在寻找类似this的东西吗?
标签: c++ c++20 typetraits