2017-11-08 11 views
3

이 함수는 특정 함수 또는 함수 객체와이 객체를 호출하기위한 인수를 취하는 함수 (apply_args())를 작성하고 완벽한 전달을 사용하여 호출합니다.args를 함수에 적용하기위한 템플릿 함수

예 :

auto fun = [](std::string a, std::string const& b) { return a += b; }; 

std::string s("world!"); 

// s is passing by lvalue ref, 
// temporary object by rvalue ref 
s = apply_args(fun, std::string("Hello, "), s); 

어떻게 그 기능을 구현할 수있다? 당신은 (함수 포인터에 변환) +funfun 람다를 전달하는 데 동의하면

+0

글쓰기에서 배우기를 원하기 때문에 쓰기를 원하십니까? 아니면 글을 쓰고 싶으니까 쓰기를 원하십니까? 두 번째 경우에는 대신 ['std :: invoke'] (http://en.cppreference.com/w/cpp/utility/functional/invoke)를 사용해야합니다. –

+0

@DanielH -'std :: invoke'는 좋은 선택이지만 C++ 17입니다. 이 질문에 대한 답은 C++ 11 – max66

+0

@DanielH 첫 번째 코드 – user1786089

답변

3
template <typename Func, typename ...Args> 
decltype(auto) apply_args(Func &&f, Args &&...args) { 
    return f(std::forward<Args>(args)...); 
} 
+1

C++ 14에 좋은 점; 하지만 문제는 C++ 11로 태그가 붙어 있습니다. 그래서'auto apply_args (Func && f, Args && ... args) -> decltype (f (std :: forward (args) ...))' – max66

+0

@ 앤드레이 R. 감사합니다! – user1786089

+0

@ max66 감사합니다! – user1786089

0

, 나는 당신이 간단하게 쓸 수 있다고 생각 apply_args()

template <typename R, typename ... Fts, typename ... As> 
R apply_args (R(*fn)(Fts...), As && ... as) 
{ return fn(std::forward<As>(as)...); } 

로 전체 예를

#include <string> 
#include <iostream> 
#include <functional> 

template <typename R, typename ... Fts, typename ... As> 
R apply_args (R(*fn)(Fts...), As && ... as) 
{ return fn(std::forward<As>(as)...); } 

int main() 
{ 
    auto fun = [](std::string a, std::string const& b) { return a += b; }; 

    std::string s("world!"); 

    s = apply_args(+fun, std::string("Hello, "), s); 

    std::cout << s << std::endl; 
} 
+1

후행 반환 유형과'decltype'을 사용하면 첫 번째 매개 변수의 유형을 지정할 필요가 없으며 단지'F ', 그리고 lambda에 특별한 것을 할 필요가 없다. (그리고 operator() 나 lambdas with captures가있는 객체처럼, 포인터로 변환 할 수없는 것들을 처리 할 수있다). –

+0

@DanielH - 작품; 좋은 솔루션 (내 것보다 낫다.)은 정말로 다르다. 대체 답안으로 제안해야합니다. – max66

+0

귀하의 솔루션은 호출 가능 객체 –