2017-06-11 1 views
3
#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)はコンパイル時にどのように型を与えますか?

はまたタイプで機能Iを受け入れ、tag::inを返す、のタイプですhttp://en.cppreference.com/w/cpp/experimental/ranges/algorithm/copy

答えて

10

も参照してください。

これは、std::functionのように、std::function<void(int)>のように使用されます。

関連する問題