2017-10-17 5 views
1

는 I 매크로를 측면).는 (포인터가 객체에 대해)

SomeObject* myObj = checkAlloc(new SomeObject()); 

를 상기 체크 포인터 함수로서 구현된다 : 매크로로서 사용

아래와 지금

inline __device__ SomeObject* checkPointer(SomeObject* pointer, char *file, int line) 
{ 
    if (pointer == nullptr) 
    { 
     // do error logging 
    } 
    return pointer; 
} 

, 각각의 유형의 기능의 새로운 버전을 생성하는 것은 매우 불편 내가 할당 할 수있는 객체의 구문을 분명히하고 싶습니다. 즉, checkAlloc<SomeObject>(…)이 아닌 각 할당 주위에 checkAlloc(…)을 넣는 것만으로도 템플릿은 선택 사항이 아닙니다.이 템플릿은 추악하고 잘하면 불필요합니다.

inline __device__ auto checkPointer(auto pointer, char *file, int line) 

을하지만 자동차 아직 함수 매개 변수에 사용할 수 없습니다 이해 :

이상적으로는이기 위하여 체크 포인터를 변경하고 싶습니다. GPU 코드는 C++ 14를 지원하므로 lambdas는 https://stackoverflow.com/a/29945034/7283981에서 읽을 수있는 잠재적 인 해결 방법으로 사용할 수 있지만이 작업을 수행하는 방법을 익히기에는 람다에 익숙하지 않습니다. 어떤 아이디어? 당신이 그것을 피하려고하는 이유

+2

템플릿 함수에는 인수 차감 기능이 있습니다. "명확하지 않은"것은 정확히 무엇입니까? 여기 오해가 거의없는 것처럼 보입니다. – StoryTeller

+0

실제로'checkAlloc (...)'*는 포인터 유형이 자동으로 추론 될 수 있기 때문에 불필요합니다. –

+0

템플릿은 여기에서 원하는 것을 정확히 수행해야합니다. 연역적이지 않으면 템플릿을 호출 할 때 유형을 지정할 필요가 없습니다. 이 경우 정상적인 기능처럼 사용할 수 있습니다. – NathanOliver

답변

3

이 템플릿을위한 완벽한 경우입니다, 이해가 안 :

template < typename T > 
inline __device__ T* checkPointer(T* pointer, const char *file, int line) 
{ 
    if (pointer == nullptr) 
    { 
    // do error logging 
    } 

    return pointer; 
} 

이 매우 명확하고 깨끗하고 auto가있는 것처럼 당신이 그것을 사용할 수 있습니다 이 : 당신이 볼 수 있듯이,이

int main(int argc, char** argv) 
{ 
    SomeObject* myObj = checkAlloc(new SomeObject()); 
} 

도 모든 종류의 사양을 필요로하지 않는 자동 인수 공제 기능 ...

아이 있고, 통지 내가 바꾼 char * fileconst char * file으로 바꾸 었으므로 C++ 11에서는 리터럴 변환이 허용되지 않습니다. char *

+0

또는 심지어'자동 myObj = checkAlloc (새로운 SomeObject()); – dcrivelli

+0

@ dcrivelli, 물론 :) –

+0

모두에게 감사합니다 - 분명히 다시 마이어스를 읽을 필요가있다. – user7283981

관련 문제