2015-02-02 2 views
0

У меня есть шаблон шаблона под шаблоном, который я использую с unique_ptr для удаления типов C.Аргумент шаблона функции с любым типом возвращаемого значения

template<typename T, void (*DeletorFunc)(T*)> 
struct CTypeDeletor 
{ 
    void operator()(T* ptr) 
    { 
    DeletorFunc(ptr); 
    } 
}; 

int main(void) 
{ 
    typedef unique_ptr<CType, CTypeDeletor<CType, CType_free>> CTypePtr; 
    CTypePtr ctype(CType_new()); 
    // ctype will be deleted when we return from main 
} 

Ну, это работает до тех пор, пока тип возврата CType_free не будет "void". Но если возвращаемый тип функции dfree не является «void», тогда я не мог использовать CTypeDeletor.

Есть ли способ, чтобы сделать CTypeDeletor более универсальным, чтобы я мог использовать свободную функцию с любым типом возврата?

+1

Как будет использоваться тип возврата, отличный от 'void'? –

+0

@RSahu 'fclose', например, не возвращает' void'. –

+0

Если все 'CTypeDeletor' делает, обертывает указатель на функцию, почему бы просто не использовать тип указателя функции непосредственно как тип делетера? –

ответ

1

Вы можете сделать существующее решение более общий характер таким образом:

template<typename T, typename RetType, RetType (*DeletorFunc)(T*)> 
struct CTypeDeletor 
{ 
    RetType operator()(T* ptr) 
    { 
    return DeletorFunc(ptr); 
    } 
}; 

Однако это понапрасну свернутый, так как вы можете просто сделать

int main(void) 
{ 
    typedef unique_ptr<CType, decltype(&CType_free)> CTypePtr; 
    CTypePtr ctype(CType_new(), &CType_free); 
} 

От cppreference,

DeleteR должен быть ссылкой FunctionObject или lvalue на ссылку FunctionObject или lvalue на функцию, вызываемый wi th аргумент типа unique_ptr :: указатель.

+0

Предполагая, что 'CType_free' является функцией,' unique_ptr 'не будет компилироваться. Вам нужен 'decltype'. –

+0

@ T.C. Ой, ты прав. Благодаря! – Pradhan

Смежные вопросы