Q
패스 기능
1
A
답변
1
아니오, 그것은 불가능합니다.
유용한 해결 방법의 정확한 특성은 문제의 특성에 따라 다르지만 대체로 std::function
및 std::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(); });
중 하나를 수행 나중에 가능하다
실제로 setMethod
을 operator()
에 A&
을 허용하는 것으로 호출하십시오.
Liskov 대체가 필요한 경우 (OP의 경우) foo
은 공통 기본 클래스의 템플릿 인수에 따라 인터페이스를 제공 할 수 없으므로이 방법이 작동하지 않습니다. 그런 다음 두 가지 옵션이 남아 :
- 함수가 함수와 같은 시간에 바인딩 할 수 있습니다에 호출되는 객체,
foo
에게 수업을 할 수 있다면, 그것은std::function<void()>
을 저장하고std::bind(&SomeClass::memberfunction, SomeObject)
을 밀어했다 그것으로. - 그렇지 않으면 가장 악의적 인 해커없이 얻을 수있는 최선은
T
인수가foo
인 공통 기본 클래스로 제한됩니다.
필요 이상으로 넘어 가면 C++ 유형 시스템의 한계를 늘리려 고 시도하고 있으며 설계를 다시 고려해야합니다.
+0
당신의 어플리케이션에 따라 여기에 따라 오는 다른 사람들을 위해 @Wintermute는 보편적 인 해결책이 아니라고 생각하지만'std :: tuple'을 사용하여 내 문제를 해결할 수있는 방법을 보여주었습니다. –
관련 문제
- 1. LLVM 패스 (기계 기능 패스)
- 2. 패스 매개 변수 기능
- 3. 패스 방법 및 기능
- 4. RcppArmadillo 패스 사용자 정의 기능
- 5. 패스 평가 정수 속으로 기능
- 6. 패스 매개 변수는 콜백 기능
- 7. 패스 MySQL의 쿼리 포함 된 MySQL의 기능
- 8. 드루팔 : 페이지 인수로 패스 기능 이름은
- 9. C++ 11 constexpr 기능 패스 매개 변수
- 10. onclick 이벤트에 자바 스크립트 패스 기능
- 11. 패스
- 12. 패스
- 13. 패스
- 14. 패스
- 15. 패스
- 16. 패스
- 17. 패스
- 18. 패스
- 19. 패스
- 20. 패스 경로
- 21. 자바 패스
- 22. 패스 변수는
- 23. 패스 기능 이름은 내가는 pthread_create 함수를 사용하여 pthread와를 만들려면 C
- 24. 패스 기능 반환 값은 내가이 함수는 선언이 있다고 가정 GCC
- 25. IE 추가 기능 - 바이 패스 인쇄 대화 상자 - 시작 위치?
- 26. 패스 매개 변수는
- 27. 스팸으로 표시된 이메일 - SPF 패스, DKIM 패스, 발신자 ID 패스
- 28. 패스 양식 매개 변수는
- 29. 패스 구조 배열 포인터
- 30. PHP에서 아파치로 사용자 이름 및 패스 패스
아니요, 없습니다. 달성하려는 목표는 무엇입니까? 따라서 해결 방법을 제안 할 수 있습니까? – Wintermute
때로는 멤버 함수와 때로는 일반적인 함수를 사용하려면'''function'과'bind'를 찾아야합니다. –
Christophe
@Wintermute 키가있는'multi_map'을 생성하고 싶습니다. 객체 유형 및 값은 해당 유형의 맵에 추가 한 함수입니다. 나의 희망은'foo'를'multi_map'의 값 타입으로 사용하는 것이 었습니다. 하지만 그것은 한 가지 질문의 범위에 비해 너무 큰 것입니다. –