我需要别名 std::get
函数以提高代码的可读性。
不幸的是,我遇到了一个编译时错误 get<0> in namespace ‘std’ does not name a type
. using
相当于typedef
所以它需要类型来处理。
我正在使用 std::tuple
表示某种数据类型:
using myFoo = std::tuple<int,int,double,string>;
using getNumber = std::get<0>;
我看了一些以前的问题,但提出的解决方案是包装并使用 std::forward
.我不想为每个成员都写这样的代码。
有没有办法只使用 using 关键字 来解决这个问题?
最佳答案
is there a way to get around this using only using keyword?
我会说不,因为std::get
不是一个类型(因此它不符合这样的用途)。
此外,即使可能,请注意 std::get
是一个重载函数,因此您需要将自己绑定(bind)到特定的实现。
也就是说,在 C++17 中,您可以这样做:
#include<tuple>
#include<utility>
using myFoo = std::tuple<int,int,double>;
constexpr auto getNumber = [](auto &&t) constexpr -> decltype(auto) { return std::get<0>(std::forward<decltype(t)>(t)); };
template<int> struct S {};
int main() {
constexpr myFoo t{0,0,0.};
S<getNumber(t)> s{};
(void)s;
}
如您所见,constexpr
lambda 和变量可帮助您创建编译时(比方说)包装器,您可以使用它们来重命名函数。
正如@T.C 正确指出的那样。在评论中,如果你想进一步概括它并为 std::get
获得一个近乎完美的别名,你可以使用变量模板:
template<int N>
constexpr auto getFromPosition = [](auto &&t) constexpr -> decltype(auto) { return std::get<N>(std::forward<decltype(t)>(t)); };
现在您可以按如下方式调用它:
S<getFromPosition<0>(t)> s{};
查看 wandbox .
关于c++ - 别名标准模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41660311/