여러 tr1 :: 함수를 저장하고 호출 할 수있는 일반 개체를 만들고 싶습니다.일반 옵션 매개 변수
지금까지, 나는
typedef tr1::function<void (SomeObject)> SomeFunction;
이 작동
vector<SomeFunction> functionStorage
같은 개체의 멤버 필드에 저장하는 타입 정의 및 벡터를 사용,하지만 난에 대한 코드를 복제 할 필요가 모든 객체에서 함수를 추가하고 호출합니다. 그래서 좀 더 일반적인 해결책을 찾으려고 노력했습니다. 이상적으로, 내가 직접
template<typename T>
class FunctionStore
{
public:
FunctionStore<T>();
virtual ~FunctionStore<T>();
void addFunction(const T &newFunction);
void callAllFunctions(const Parameter & parameter) const;
private:
vector<T> functionStorage;
};
등 모두 반환 형식과 매개 변수 유형을 포함, 함수 형식 정의를 전달할 수 있습니다하지만 난 내에서 밖으로 매개 변수 목록을 얻을 수 있기 때문에이 작동하지 않은 일부 템플릿 객체를 원했다 템플릿은 callAllFunctions
함수를 올바르게 정의해야합니다.
template<typename R = void, typename P1 = void>
class FunctionStore
{
typedef tr1::function<R(P1 &)> Function;
public:
FunctionStore<R, P1>();
virtual ~FunctionStore();
void addFunction(const Function &newFunction)
{
functionStorage.push_back(newFunction);
}
void callAllFunctions(const P1 ¶meter) const
{
for(Function fn : functionStorage)
{
fn(parameter);
}
}
private:
vector<Function> functionStorage;
};
하지만 이걸로는 P1 유형을 선택적으로 만들 수 없습니다. 나는 이것을 기본값으로 void로 시도했지만, P1 & parameter
으로 사용하기 때문에, fn(void &)
을 예상하는 것으로 평가할 것이다. 이것은 fn()
과 같지 않다. 또한 &
을 사용하지 않으면 불법적 인 void 참조가 만들어지기 때문에 작동하지 않습니다. 또한 변수 요구 사항을 해결할 수 있기 때문에 variadic 매개 변수에 대해 생각했지만 매개 변수 개수와 형식이 분명히 유형에 분명히 정의되어 있으므로 (tr1 :: bind placeholder stuff에 필요함) 잘못된 방식 인 것 같습니다. 가다.
그래서 어떻게해야합니까? 첫 번째 옵션을 만들 수있는 실제 방법이 없다고 가정합니다. 두 번째 옵션에 대한 솔루션은 여전히 많은 도움이됩니다. C++ (11)와 가변 인자 템플릿으로
는
C++ 11에 액세스 할 수 있습니까? 나는 추정하지 않는다. – Yakk
글쎄, 이것도 Windows에서 실행되어야하므로, 나는 C++ 0x와 함께 minGW의 GCC4.7을 컴파일한다. 그래서 기본적으로 C++ 11이지만 함수 같은 것들은 여전히 tr1에있다. 단순함을 위해서, C++ 11로 가정하자 .. – DragonTEC