1

내가 템플릿을 말해봐?패스 기능

이 나는 ​​시도했다 :

  • foo<void>().setMethod(&func);
  • foo<nullptr_t>().setMethod(&func);
+4

아니요, 없습니다. 달성하려는 목표는 무엇입니까? 따라서 해결 방법을 제안 할 수 있습니까? – Wintermute

+0

때로는 멤버 함수와 때로는 일반적인 함수를 사용하려면'''function'과'bind'를 찾아야합니다. – Christophe

+0

@Wintermute 키가있는'multi_map'을 생성하고 싶습니다. 객체 유형 및 값은 해당 유형의 맵에 추가 한 함수입니다. 나의 희망은'foo'를'multi_map'의 값 타입으로 사용하는 것이 었습니다. 하지만 그것은 한 가지 질문의 범위에 비해 너무 큰 것입니다. –

답변

1

아니오, 그것은 불가능합니다.

유용한 해결 방법의 정확한 특성은 문제의 특성에 따라 다르지만 대체로 std::functionstd::bind (또는 람다)입니다. 매우 일반적인 용어로, 트릭은 대개 foo을 바꿔 쓰는 것과 같은 방식으로 바꿔 쓰는 것입니다 (이것은 std::function을위한 것입니다). 이 작업이 완료 될 수

한 가지 방법은 유형

struct A { 
    void foo(); 
    void bar(int); 
}; 

과 기능을 감안할 때

template <typename T> 
class foo{ 
public: 
    // Here we do not care about the type of function we're binding 
    template<typename Func> 
    void setMethod(Func f) { func_ = f; } 

    void callMethod(T &obj) { func_(obj); } 

private: 
    // only about its signature 
    std::function<void(T&)> func_; 
}; 

입니다

void qux(A &); 

Foo<A> f; 

f.setMethod(&A::foo); 
f.setMethod(qux); 
f.setMethod(std::bind(&A::bar, std::placeholders::_1, 2)); 
f.setMethod([](A &obj) { obj.foo(); }); 
중 하나를 수행 나중에 가능하다

실제로 setMethodoperator()A&을 허용하는 것으로 호출하십시오.

Liskov 대체가 필요한 경우 (OP의 경우) foo은 공통 기본 클래스의 템플릿 인수에 따라 인터페이스를 제공 할 수 없으므로이 방법이 작동하지 않습니다. 그런 다음 두 가지 옵션이 남아 :

  • 함수가 함수와 같은 시간에 바인딩 할 수 있습니다에 호출되는 객체, foo에게 수업을 할 수 있다면, 그것은 std::function<void()>을 저장하고 std::bind(&SomeClass::memberfunction, SomeObject)을 밀어했다 그것으로.
  • 그렇지 않으면 가장 악의적 인 해커없이 얻을 수있는 최선은 T 인수가 foo 인 공통 기본 클래스로 제한됩니다.

필요 이상으로 넘어 가면 C++ 유형 시스템의 한계를 늘리려 고 시도하고 있으며 설계를 다시 고려해야합니다.

+0

당신의 어플리케이션에 따라 여기에 따라 오는 다른 사람들을 위해 @Wintermute는 보편적 인 해결책이 아니라고 생각하지만'std :: tuple'을 사용하여 내 문제를 해결할 수있는 방법을 보여주었습니다. –