Шаблонная функция - недопустимое использование

Подскажите пожалуйста, в чем у меня ошибка в попытке сделать шаблонную функцию ?

int my_func_1(std::wstring my_wstring, int my_int)
{
    std::cout << "my_wstring_size:" << my_wstring.size();
}

int my_func_2(std::string my_string, int my_int)
{
    std::cout << "my_string_size:" << my_string.size();
}

.

template <typename my_type1, typename my_type2, typename my_type3, typename my_type4>

int my_func_shablon(int(*pointer_to_func) (my_type1, my_type2), my_type3, my_type4)
{
    pointer_to_func(my_type3, my_type4);  //ОШИБКА: my_type3 : недопустимое использование этого типа в качестве выражения
}

.

int main()
{
    std::string my_string = "string";

    my_func_shablon(my_func_1, my_string, 1);
}

Ошибка:

my_type3, my_type4 : недопустимое использование этого типа в качестве выражения

..

..

..

..

..

Очень условно-абстрактный код:

int My_find_substrings_in_string_memcmp_1(std::string& my_string, std::string& my_substring, size_t pos_1, size_t  pos_2, size_t num_find, int chek_error_flag)
{
//Код ищущий подстроку в строке с помощью memcmp:
//......код

return [номер элемента в my_string с которого найдена подстрока]
}


int My_find_substrings_in_string_memcmp_2(std::string& my_string, std::string& my_substring, char* pos_1, char*  pos_2, size_t num_find, int chek_error_flag)
{
//Код ищущий подстроку в строке с помощью memcmp:
//......код

return [номер элемента в my_string с которого найдена подстрока]
}


int My_find_substrings_in_string_wmemcmp_1(std::wstring& my_wstring, std::wstring& my_subwstring, size_t pos_1, size_t  pos_2, size_t num_find, int chek_error_flag)
{
//Код ищущий подстроку в строке с помощью wmemcmp:
//......код

return [номер элемента в my_string с которого найдена подстрока]
}


int My_find_substrings_in_string_wmemcmp_2(std::wstring& my_wstring, std::wstring& my_subwstring, wchar_t* pos_1, wchar_t*  pos_2, size_t num_find, int chek_error_flag)
{
//Код ищущий подстроку в строке с помощью wmemcmp:
//......код

return [номер элемента в my_string с которого найдена подстрока]
}

А теперь предположим я хочу добавить функционал подсчета подстрок в строке - мне придется создавать новые 4 -функции и добавлять в них дополнительный код, который будет подсчитывать кол-во найденных подстрок в строке.

Или я могу сделать Одну шаблонную функцию, которая примет на вход указатель на одну из четырех функций и дополнительный параметр в который поместить подсчитанное кол-во подстрок:

template <typename my_type1, ... my_type6>

void My_shablon_counting(int(*my_pointer_to_func) (my_type1, ...my_type6), my_type1, ...my_type6, size_t& num_count)
{

repeat:
int result = my_pointer_to_func(my_type1, ...my_type6)

if(result != -1)
{
num_count++;

goto repeat;
}


}

.

in main()
{
My_shablon_counting(My_find_substrings_in_string_memcmp_1, num_count);
My_shablon_counting(My_find_substrings_in_string_memcmp_2, num_count);
My_shablon_counting(My_find_substrings_in_string_wmemcmp_1, num_count);
My_shablon_counting(My_find_substrings_in_string_wmemcmp_2, num_count);

//То есть вызов функции My_shablon_counting и реализация функции My_shablon_counting - одна, а не 4-е.
}

Ответы (1 шт):

Автор решения: AR Hovsepyan

По моим догадкам вам нужно это:

template <typename my_type1, typename my_type2>    
int my_func_shablon(int(*pointer_to_func) (my_type1, my_type2), my_type1 arg3, my_type2 arg4)
{
   return  pointer_to_func(arg3, arg4); 
}
int main() {

    std::string my_string = "string";
    my_func_shablon(my_func_2, my_string, 1);
    return 0;
}

И вы хотите знать почему ваш код ошибочный. Шаблон принимает в аргумент указатель на функцию, аргументы которой имеют типы my_type1 и my_type2. И вы пытаетесь вызвать функцию с аргументами других типов и вызываете без объектов(при вызове нужны объекты, а не типы.

При всем этом нужно передавать в функцию соответствующие типы, и вы, к тому же, не возвращаете ничего ни из одной функции.

→ Ссылка