2016-10-21 4 views
1

(f + g)을 (f + g) (x) : = f (x) + g (x)로 정의하십시오. 기존의 행렬 추가는이 정의와 일치합니다. 여기 함수 만 허용하는 함수에 대한 인터페이스 정의

operator+는 사용자 정의 유형을 소모하기 때문에 실패 순진 구현

template<typename Funcf, typename Funcg> 
auto operator+(Funcf f, Funcg g){ 
    return [f, g](auto x){return f(x) + g(x);}; 
} 

입니다. 다음 시도가 있습니다

template<typename R, typename I> 
auto operator+(std::function<R(I)> f, std::function<R(I)> g){ 
    return [f, g](auto x){return f(x) + g(x);}; 
} 

이것은 작동하며 네임 스페이스를 없애지 않습니다. 그러나 그것은 우회적 인 일이며, 전화 사이트는 못생긴 auto added = std::function<int(int)>{f} + std::function<int(int)>{g};입니다.

첫 번째 operator+이 허용 된 경우 (또는 추가로 이름이 바뀐 경우) 호출 사이트가 더 좋고 함수가 인라인됩니다. 그러나 그것은 모든 것에 맞서려고 시도합니다.

입력이 기능이지만 여전히 인라인으로 지정되지만 지나치게 일반적인 이름으로 네임 스페이스를 오염시키지 않는 템플릿 인터페이스를 정의 할 수 있습니까?

다른 말로하면 편리한 호출 사이트가있는 std::function의 컴파일 시간 버전이 있습니까? 나는 대답이 부정이라고 강력하게 의심한다. 대답이 '아니오'인 경우 위의 두 극단 사이에 타협이 있습니까?

또는 옵션 3, 내가 잘못 생각하고 있습니까? C++에서 (f + g)를 모델링하는 방법은 무엇입니까?

+1

'f + arg_wise + g'은 어떻습니까? – Yakk

+1

개인 의견 : 작동하도록 설정했다고해도 운영자 과부하를 남용 할 수 있습니다. 이 동작은 표준과는 거리가 .니 다. –

+0

@Baum mit Augen 함수는 [벡터 공간] (https://en.wikipedia.org/wiki/Examples_of_vector_spaces#Function_spaces)을 형성합니다. ((f + g) + h) = (f + (g + h)) 및 (f + g) = (g + f)이기 때문에 문제는 없습니다. – Polymer

답변

1

연산자는 사용자 정의 유형에서만 작동합니다. 그럼 당신의 기능을 만들어 봅시다!

우리는하지만, 사용자 정의 형의 이름으로, 기본적으로 람다하는 유형을 정의 할 수는 :

template<typename F> 
struct addable_lambda_impl : F { 
    template<typename T> 
    addable_lambda_impl(T f) : F{std::move(f)} {} 

    using F::operator(); 
}; 

template<typename F> 
addable_lambda_impl<F> addable_lambda(F f) { 
    return addable_lambda_impl<F>{std::move(f)}; 
} 

이 의지는 모든 유형을 확장하고 operator() 함수의 사용하는 클래스입니다. 당신의 연산자를 구현하는 것은 쉬운 너무

auto lambda = addable_lambda([](){}); 

: 그것은 완벽하지만 약간 덜 추한 아니다

template<typename F, typename G> 
auto operator+(addable_lambda_impl<F> f, addable_lambda_impl<G> g){ 
    return addable_lambda([f, g](auto x){ return f(x) + g(x); }); 
} 

지금, 당신은 addable_lambda 기능을 사용할 수 있습니다. 또한 std::function이 추가하는 오버 헤드가 발생하지 않습니다.

+0

'f + g + h '를 허용하기 위해서'addable_lambda'를 돌려 줄 수도 있습니다. – Jarod42

+0

사실, 지적 해 주셔서 고맙습니다. –

+0

정말 멋집니다. 그것은 내가 좋아할만한 영리한 것이지만, 내가 부탁 한 것을합니다. 장식 기능을 익히는 좋은 방법이 있는지 의심 스럽다. – Polymer

관련 문제