(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)를 모델링하는 방법은 무엇입니까?
'f + arg_wise + g'은 어떻습니까? – Yakk
개인 의견 : 작동하도록 설정했다고해도 운영자 과부하를 남용 할 수 있습니다. 이 동작은 표준과는 거리가 .니 다. –
@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