c++ - 别名标准模板函数

标签 c++ c++17 stdtuple

我需要别名 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/

相关文章:

c++ - 为什么我在使用 fwrite() 和 fread() 时遇到问题?

c++ - OpenCV predict() 与 detectMultiScale()

c++ - 具有单个互斥体的 std::scoped_lock 行为

c++ - 在 C++17 中使用容器时,noexcept move 操作是否有好处?

C++ - 在 unordered_map 中使用多个值作为键的最佳方式

c++ - 在 for 循环中使用 erase() 只删除第一行

c++ - 使用硬编码元素初始化 std::vector<MyClass> 的最简单方法是什么?

c++ - 允许模板化类的结构化绑定(bind)

c++ - 以后可以使用分配器构造 std::tuple 的元素吗?

c++ - 如何使映射键具有两种不同的数据类型?