2013-07-18 1 views
4

벡터의 모든 요소를 ​​다른 어떤 산술 연산 (코드가 아님)을 사용하여 로그 값으로 변환하려고합니다. Boost.Lambda를 사용하면 어떻게됩니까?<cmath>의 함수를 Boost.Lambda와 함께 사용하는 방법은 무엇입니까?

내가 말했듯이, 더 많은 산술 연산이 있으므로 Boost.Bind가있는 표현식이 저에게는 효과적이지 않습니다 (너무 복잡하고 너무 길며 읽을 수 없음).

저는 C++ 11 람다도 사용하고 싶지 않습니다. 하지만 ... 아무것도 바꿀까요?

내 코드는 같은 수 있습니다 :

Error 1 error C2665: 'log' : none of the 3 overloads could convert all the argument types 
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\math.h(120): could be 'double log(double)' 
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\math.h(527): or  'float log(float)' 
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\math.h(575): or  'long double log(long double)' 
while trying to match the argument list '(boost::lambda::placeholder1_type)' 

업데이트 1 : 내가 펑터를 작성하지 않으

#include <boost/lambda/lambda.hpp> 
#include <cmath> 
#include <vector> 

void testLambda() 
{ 
    using namespace boost::lambda; 

    std::vector<double> v; 
    v.push_back(1); v.push_back(2); v.push_back(3); 

    std::transform(v.begin(), v.end(), v.begin(), _1/0.5);  // works 
    std::transform(v.begin(), v.end(), v.begin(), log(_1)/0.5); // produces error 
    //std::transform(v.begin(), v.end(), v.begin(), std::log(_1)/0.5); // produces error 
    //std::transform(v.begin(), v.end(), v.begin(), static_cast<double(*)(double)>(std::log)(_1)/0.5); // produces error 
} 

내가 코드를 컴파일하려고, MSVC2010 오류를 제공합니다 그것을 위해, 나는 그들 중 12 개를 가져야한다고 생각합니다. 그 때 무엇입니까?

업데이트 2 : 나는 C++ 11 람다와 함께 할 수 있어요 하지만 은 내가을 위해 무엇을 물어 아니다 :

std::transform(v.begin(), v.end(), v.begin(), [](const double & x) { return log(x)/0.5; }); 
+0

http://stackoverflow.com/a/1931602/98654/함께 결합 여러 람다를 사용하는 예제가 있습니다 - 그게 니가 찾고있는거야? –

+1

그냥 일반 함수 객체를 작성하십시오. – TemplateRex

+0

@NateKohl lambdas와 bind가 함께 작동하지 않습니다. 해결책을 주시겠습니까? –

답변

2

어떻게 적절한 C++ (11) 람 바어에 대한? MSVC2010은 제한적으로 지원되지만 일반 수학은 잘 작동합니다.

std::transform(v.begin(), v.end(), v.begin(), [](const double& x) { return log(x); }); 

또는 문제에 대한 구식 솔루션 : 당신이 벡터의 요소를 수정해야하는 것 때문에 어쨌든

struct f 
{ 
    double operator()(const double& x) 
    { 
    return log(x); 
    } 
} 
std::transform(v.begin(), v.end(), v.begin(), f); 

, 난 당신이 게시 코드에서 화려한 람다 물건에 대한 필요를 볼 인 - 장소 : 가장 깨끗한 방법은이 작업을 수행 이럴

std::vector<double> v; 
v.push_back(1); v.push_back(2); v.push_back(3); 
for(const std::vector<double>::iterator it = v.begin(); it != v.end(); ++it) 
{ 
    /* fancy math stuff here */ 
    *it = log(*it); 
} 

이다. 내 최종 C++ 솔루션 (지금까지 가장 표현력이 모든 대안의 간단한을에 의해) 될 것이다 :

for(auto&& x : v) 
{ 
    /* fancy math stuff here */ 
    x = log(x); 
} 
+0

나는 C++ 11 람다 나 펑터를 원하지 않는다. 이전 - C++ 03이 제한되었습니다. 후자 - 많은 경우 읽을 수 없습니다. –

+0

@Curdeius 나는 너에게 운이 없다고 생각할 것이다. Boost.Lambda의 문서에는 'int foo (int); for_each (v.begin(), v.end(), _1 = bind (foo, _1));'와치는 원하지만'bind'를 사용합니다. C++ 03은 기능 언어가 아닙니다. 'for' 루프를 사용하지 못하게하는 것은 무엇입니까? – rubenvb

+0

''for'' 루프를 수행하는 것을 막을 수있는 방법이 없으므로 나머지 코드와 일관되게하고 싶었습니다. –

관련 문제