函数调用如何提供编译时类型?

时间:2017-06-11 09:56:47

标签: c++ syntax range standards c++17

#include <range/v3/all.hpp>

using namespace ranges;

template<typename I, typename O>
tagged_pair<tag::in(I), tag::out(O)>
f(I i, O o)
{
    return { i, o };
}

int main()
{
    char buf[8]{};
    f(std::begin(buf), std::end(buf));
}

代码使用range-v3,可以使用clang进行编译。

但是,我无法理解为什么行tagged_pair<tag::in(I), tag::out(O)>是合法的。 I是一种类型,tag::in(I)也是一种类型,tag::in不是宏,tag::in(I)在编译时如何提供类型?

另见http://en.cppreference.com/w/cpp/experimental/ranges/algorithm/copy

1 个答案:

答案 0 :(得分:10)

这是一种接受I并返回tag::in的函数,它也是一种类型。

例如在std::function中使用此功能,例如std::function<void(int)>