1

한 줄에있는 함수를 제외하고는 거의 똑같은 기능을 수행하는 몇 가지 c 함수가 있습니다.함수 포인터를 여러 함수 유형의 매개 변수로 받아들이는 함수에 대한 템플릿 함수 만들기

Func1(type parameter); 

Func2(type1 parameter1,type2 parameter2); 

FuncFunc(FunctionPointer functionPointer){ 
    funcVar; 
    ... 
    functionPointer(funcVar,....); 
    ... 
} 

int main(){ 
    FuncFunc(Func1); 

    FuncFunc(Func2(,type2Object)); 
} 

내가 C++에서이 작업을 수행 할 수 있습니다 어쨌든 거기 : 나는 그 한 줄에 대한 함수 포인터로 전달할 수있는 하나 개의 기능을 가진 모든 기능을 대체 할?

+2

이것은 확실히 C++에서 할 수 있습니다. 그러나 귀하의 질문은 다소 불분명합니다. "한 줄에있는 함수를 제외하고는 똑같은 일을하는 몇 가지 c 함수"- 이것은 완전히 분석 할 수 없습니다. 당신이 추정하고 예를들 수 있습니다. –

답변

2

달성하려는 목표는 명확하지 않지만 코드가 올바른 C++로 어떻게 변환 될 수 있는지 예제가 나와 있습니다.

template<typename F> 
void GuncFunc(const F& fPtr) { 
     std::string funcVar = "Foo!"; 
     fPtr(funcVar); 
} 

:

template<typename ...T> 
void FuncFunc(const std::function<void(T...)>& fPtr) { 
     std::string funcVar = "Foo!"; 
     fPtr(funcVar); 
} 

또는 쉽게는 변형을 사용 :

template<typename T1, typename T2> 
void Func(T1 par1, T2 par2) { 
     std::cout << par1 << " " << par2 << std::endl; 
} 

그런 다음 우리는 당신이 원하는 모든 기능을 수용 FuncFunc을해야한다 : 첫째, 인수의 최대 수와 Func를 정의 할 수 마지막으로 FuncFunc :

auto Func1 = std::bind(Func<float, std::string>, 3.14f, std::placeholders::_1); 
auto Func2 = std::bind(Func<std::string, int>, std::placeholders::_1, 42); 
FuncFunc(std::function<void(std::string)>(Func1)); 
FuncFunc(std::function<void(std::string)>(Func2)); 
return 0; 
01 23,516,

또는 GuncFunc :

// Using std::bind 
GuncFunc(std::bind(Func<float, std::string>, 3.14f, std::placeholders::_1)); 
GuncFunc(std::bind(Func<std::string, int>, std::placeholders::_1, 42)); 

// Or using lambdas: 
GuncFunc([](std::string s){Func<float, std::string>(3.14f, s);}); 
GuncFunc([](std::string s){Func<std::string, int>(s, 42);}); 

std::bind 또는 람다이 질문의 범위를 벗어난 것 같다 선택,하지만 당신은 here, there 또는 this 문제의 유용한 무언가를 발견 할 수있다.

어쨌든, lambdas, std::function, std::bind 또는 variadic templates가 필요합니다 가능성이 높다.

+1

'std :: bind' 대신 lambdas를 사용할 수도 있습니다 (아마도 선호해야합니다). – qxz

+0

@qxz 메모 해 주셔서 감사합니다. – Sergey

관련 문제