Теперь первый вопрос: правильна ли реализация этого шаблона?
Компилируется ли он, когда вы пытаетесь вызвать его?
Второй: Как бы я это назвалфункция замены извне этого класса?
Аргументы шаблона выводятся из указателя функции.Где func_T
- это тип возвращаемого значения.Я бы посоветовал против этого и порекомендовал бы более простой параметр шаблона:
template<typename Struct_Type_T>
struct CGlobal_Struct
{
template<typename func_T, typename func_arg_t>
bool Replace(func_T function, const func_arg_t func_args,const uint32_t mutex_timeout = 100) {
// function(struct_type_value, func_args);
}
};
Обе версии действительны и называются так:
struct A {};
void func(A&, int) {}
int main() {
CGlobal_Struct<A> glob;
glob.Replace(func, 1);
}
Версия, которую я рекомендую, также может поддерживать лямбды:
glob.Replace([](A&, int){ /* code */ }, 1);
Читая вашу реализацию, она не будет работать с вашей текущей версией:
//Replace Data
func_T(data, func_args);
Проблема в том, что func_T
является типом возвращаемого типафункция отправлена как параметр.Это то же самое, что и это:
void(data, func_args);
Или еще больше зла:
struct evil { evil(A&, int){} };
// ...
evil(data, func_args);
Это вызовет конструктор evil
и никогда не вызовет функцию.
Если вы посмотрите внимательно, у вашего параметра нет имени:
bool Replace(
func_T(Struct_Type_T&, const func_arg_t),
/* other params */ );
Чтобы дать ему имя, синтаксис будет:
bool Replace(
func_T(*function)(Struct_Type_T&, const func_arg_t),
/* other params */ );
Затем вызовите function(...)