У меня есть следующий код база:Функция принимает как указатель на член-функцию и указатель на константный член-функцию
template <typename Type>
class SomeClass {
public:
template <typename ReturnType, typename... Params>
void register_function(const std::pair<std::string, ReturnType (Type::*)(Params...)> fct) {
auto f = [fct](Params... params) -> ReturnType { return (Type().*fct.second)(std::ref(params)...); }
// ...
}
};
Это работает, когда я передать указатель на член-функцию (неконстантная). Однако, если я хочу передать указатель на константный член-функции, это приводит к ошибке компиляции, и я должен дублировать функции выше, чтобы получить этот код:
template <typename Type>
class SomeClass {
public:
template <typename ReturnType, typename... Params>
void register_function(const std::pair<std::string, ReturnType (Type::*)(Params...)> fct) {
auto f = [fct](Params... params) -> ReturnType { return (Type().*fct.second)(std::ref(params)...); }
// ...
}
template <typename ReturnType, typename... Params>
void register_function(const std::pair<std::string, ReturnType (Type::*)(Params...) const> fct) {
auto f = [fct](Params... params) -> ReturnType { return (Type().*fct.second)(std::ref(params)...); }
// ...
}
};
Теперь я могу передать как const- члены-функции и не-const-члены-функции. Но теперь код дублируется, а ремонтопригодность сокращается.
Есть ли способ объединить эти две функции в функцию, принимающую как const-члены-функции, так и не-const-member-функции?
Важное замечание: я действительно должен использовать функцию указателя как параметр (no std :: function).
Редактировать: Я добавил еще немного кода. Внутри функций я строю замыкание, соответствующее сигнатуре функции-члена (такие же типы возврата и параметры). Это замыкание будет храниться и использоваться в дальнейшем для создания отражения (more here)
Почему не просто 'шаблон <имяТипа Fun> аннулируются register_function (Fun ГЦТ)'? – fredoverflow
Я обновляю свой вопрос с помощью немного кода. Внутри лямбда я могу вызвать std :: bind или напрямую использовать указатель функции-члена в экземпляре нового объекта. Вот почему мне действительно нужно получить доступ к типам ReturnType и Params. –
Это весь ваш код? lol really –