Ich versuche variadische Vorlagen zu verwenden, um die Parametertypen für eine Elementfunktion zu speichern. Ich versuche dies zu erreichen, indem ich jeden Typ mit einem Schlüssel assoziiere und diesen Schlüssel dann in einem std :: vector ablege. Der Code für diesen Schlüssel zu schaffen ist wie folgtFehler beim Versuch, das Template-Parameterpaket zu erweitern
template <typename T>
class ClassInfo {
public:
inline static void const* GetClassKey() {
static char key;
return &key;
}
};
Dann benutze ich den folgenden Code, um zu versuchen die Schlüssel in einem std zu speichern :: vector
class WrappedMemberFunction {
void *function_pointer; // Holds the member function pointer
void const* class_type; // Class type key
void const* return_type; // Return type key
std::vector<void const*> parameter_types; // Parameter type keys
void StoreArguments() {}
template <typename Arg, typename... Args>
void StoreArguments() {
parameter_types.push_back(ClassInfo<Arg>::GetClassKey());
StoreArguments<Args...>(); // Error here: No matching member function for call to 'StoreArguments'
}
public:
template <typename Class, typename ReturnType, typename... Args>
WrappedMemberFunction(ReturnType (Class::*member_pointer)(Args...)) {
// Store member pointer as regular old void pointer
function_pointer = (void*&)member_pointer;
// Store class type
class_type = ClassInfo<Class>::GetClassKey();
// Store return type
return_type = ClassInfo<Class>::GetClassKey();
// Store parameter types
StoreArguments<Args...>();
}
};
Was ich bin stecken zu werden, ist die Variadische Rekursion benötigt, um jeden Klassenschlüssel zu speichern. Ich erhalte einen Fehler in der oben angegebenen Zeile, was der rekursive Schritt beim Versuch ist, das Parameterpaket zu erweitern. Was mache ich hier falsch?
oder Missbrauch nur die Vorlage Argumentliste mit einem konstanten führenden Nicht-Typ Argumente und eine ähnliche Spezialisierung, [wie diese] (http://ideone.com/5qttEV). – WhozCraig