Функция передачи C ++ с аргументами в качестве шаблона - PullRequest
0 голосов
/ 06 марта 2019

У меня проблема с шаблоном. Я создал универсальный класс, который хранит глобальную доступную информацию.Этот класс содержит закрытый мьютекс для управления доступом к глобальной информации.

template<typename Mutex_Type_T, typename Struct_Type_T>
class CGlobal_Struct
{
public:
/**
         * Exports data from this class to target
         * @param target the actual target
         * @param mutex_timeout Mutex wait time
         * @return true in case of success
         */
        bool Export(Struct_Type_T& target, const uint32_t mutex_timeout = 100);
        /**
         * Imports data to this class
         * @param source The data to store in this class
         * @param mutex_timeout Wait Time for Mutex
         * @return true in case of success
         */
        bool Import(const Struct_Type_T& source, const uint32_t mutex_timeout = 100);
             /**
     * 1) Loads Data to Buffer
             * 2) performs user defined Operation by calling func_T(data, args)
             * 3) stores back the data
     * @param User defined function
     * @param values class data to modify
             *  @param mutex_timeout Mutex wait time
     * @return true in case of success
     */
            template<typename func_T, typename func_arg_t>
        bool Replace(func_T(Struct_Type_T& values, const func_arg_t args), const func_arg_t func_args,const uint32_t mutex_timeout = 100);

private:
mutex _mutex;
}

Эта реализация выглядит следующим образом

template<typename Mutex_Type_T, typename Struct_Type_T>
template<typename func_T, typename func_arg_t>
bool CGlobal_Struct<Mutex_Type_T, Struct_Type_T>::Replace(func_T(Struct_Type_T& values, const func_arg_t args),const func_arg_t func_args, const uint32_t mutex_timeout)
    {
        CLock_Guard lock(mutex);

        //Lock access
        if(false == lock.Lock(mutex_timeout))
        {
                //Locking failed
            return false;
        }
        //Replace Data
        func_T(data, func_args);

        //Mutex is released automatically when we leave this function
        return true;
    }

Теперь первый вопрос: правильна ли реализация этого шаблона?

Второе: как бы я вызвал эту функцию за пределами этого класса?Не могли бы вы помочь мне, пожалуйста?

1 Ответ

0 голосов
/ 06 марта 2019

Теперь первый вопрос: правильна ли реализация этого шаблона?

Компилируется ли он, когда вы пытаетесь вызвать его?

Второй: Как бы я это назвалфункция замены извне этого класса?

Аргументы шаблона выводятся из указателя функции.Где 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(...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...