Преобразовать шаблон функции в набор функций перегрузки

Предполагая, что это моя библиотека. И это очень огромная библиотека:

library.hpp

template<class usertype> void function_name(usertype aaa)
{
}

Это мой главный

int main()
{
int x=3;
function_name(x);
double y=3.5;
function_name(y);
return 0;
}

Я не знаю, что происходит внутри библиотеки. Я хочу преобразовать библиотеку, чтобы адаптировать мой код. Фактически, превращение шаблона в реальный код.

Мне нужно, чтобы приведенный выше код библиотеки был преобразован в:

void function_name(int aaa)
{
}

void function_name(double aaa)
{
}

Поэтому я могу манипулировать библиотекой в ​​соответствии со своими потребностями, а не манипулировать общим кодом, который работает для всех. Как сделать это преобразование из шаблона в реальный код (без ручного труда, но автоматически)?

Редактировать:

Я хочу конвертировать весь файл library.hpp в library_2.hpp который не содержит шаблона. Вместо этого с двумя реально реализованными функциями. Это то, что происходит в середине компиляции.

я не ищем для сокращения времени компиляции. Я имею дело с огромной библиотекой из 196 файлов. Среди этих многих функций в библиотеке мне понадобятся некоторые из них, связанные с моей работой. я собираюсь взломать и расширить эта библиотека. Расширение всей библиотеки стоило мне огромных усилий. Я просто хочу расширить только то, что мне нужно. Поэтому для меня очень важно уменьшить код, упростить его и удалить все шаблоны, заменив их явным кодом.
Я не очень хорош в C ++, и это ошибки компилятора. Поэтому в такой огромной библиотеке я предпочитаю использовать автоматические методы, а не ручное манипулирование кодом. Я также не очень хорошо разбираюсь в этой библиотеке. Чтобы понять библиотеку, лучше преобразовать ее сложные функции в явно реализованный код, связанный с тем, что мне действительно нужно. Тогда я могу лучше понять чей-то код. Я удалю функции, не связанные с моими потребностями. Мне тоже наплевать на обновления, поступающие в библиотеку. Как только я создаю новую библиотеку, ее обслуживание — моя обязанность. И новая библиотека будет намного меньше и проще в обслуживании. Комментарии показывают, что некоторые люди смотрят на мою цель с другой точки зрения. Я надеюсь, что это объяснение понятно.

В случае любопытства библиотека, которой я собираюсь манипулировать, odeint связанные с математическими вычислениями с редкими изменениями или ошибками внутри.

2

Решение

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

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

Создайте свой собственный файл заголовка library_wrapper.hpp, Там вы объявляете не шаблонные версии функций, которые вы хотите использовать.

library_wrapper.hpp

#ifndef LIBRARY_WRAPPER_H
#define LIBRARY_WRAPPER_H

#include <vector>  // just an example

namespace library_wrapper
{
void
function_name(int);

void
function_name(double);

int
another_function(const std::vector<double>&, bool);
}

#endif

А затем «внедрите» их раз и навсегда, используя свою так мало любимую библиотеку шаблонов.

library_wrapper.cpp

#include "library_wrapper.hpp"#include <library.hpp>  // the template library

namespace library_wrapper
{
void
function_name(const int arg1)
{
return library::function_name(arg1);
}

void
function_name(const double arg1)
{
return library::function_name(arg1);
}

int
another_function(const std::vector<double>& arg1, const bool arg2)
{
return library::function(arg1, arg2);
}
}

Вы компилируете library_wrapper.cpp один раз сражайтесь с шаблонами, а затем продолжайте использовать только вашу обертку, которая предоставляет функции без шаблонов.

Имейте в виду, что такой подход ставит под угрозу одну из основных причин, по которой шаблоны могут быть настолько быстрыми: встраивание. Ваши функции-оболочки не могут быть встроены во время компиляции, потому что вы скрываете их определения от компилятора. Это сделано специально и, с другой стороны, сокращает время компиляции. Встраивание во время ссылки может дать вам некоторое вложение, но вы не должны воспринимать это как должное.

Обратите внимание, что это решение не очень хорошо работает с типы (в отличие от функции). Вы можете попробовать написать несколько pimpl-упаковщиков, но я не рекомендую этого. Возможно, лучше всего подружиться с вашей библиотекой шаблонов …

Обновите адрес вашего обновленного вопроса

Я имею дело с огромной библиотекой из 196 файлов. Среди этих многих функций в библиотеке мне понадобятся некоторые из них, связанные с моей работой.

В случае любопытства библиотека, которой я собираюсь манипулировать, связана с математическими вычислениями с редкими изменениями или ошибками внутри.

Кажется, что вышеприведенный подход действительно может помочь.

Расширение всей библиотеки стоило мне огромных усилий. Я просто хочу расширить только то, что мне нужно. Поэтому для меня очень важно уменьшить код, упростить его и удалить все шаблоны, заменив их явным кодом.

Я не думаю, что это хороший подход. Вместо этого используйте библиотеку как черный ящик и создайте свою собственную поверх нее. Сконцентрируйте свои усилия разработчиков на новых функциях и получите выгоду от обновлений для базовой библиотеки.

Я предполагаю, что рассматриваемая библиотека является свободным программным обеспечением (в противном случае то, что вы хотите сделать, было бы незаконным в любом случае), и проект свободного программного обеспечения должен поддерживать друг друга. Если вы создаете потрясающую библиотеку Y поверх библиотеки X, оба
проекты, X и Y, могут принести пользу. С другой стороны, если вы удалите только часть этой другой библиотеки и добавите другие функциональные возможности, ваши два конкурирующих проекта могут оказаться в итоге чем-то неполным и несовместимым, что разочаровывает как вас, так и ваших пользователей.

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

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

Я не очень хорош в C ++, и это ошибки компилятора. […] Я также не очень разбираюсь в этой библиотеке.

Я намерен взломать и расширить эту библиотеку.

Мне тоже наплевать на обновления, поступающие в библиотеку. Как только я создаю новую библиотеку, ее обслуживание — моя обязанность.

Я не хочу показаться грубым, но … ты видишь проблему?

2

Другие решения

по специализации

template<>
void function_name(int aaa)
{
}

template<>
void function_name(double aaa)
{
}

образец кода

#include <iostream>
template<class usertype>
void function_name(usertype aaa)
{
std::cout << "default\n";
}

template<>
void function_name(int aaa)
{
std::cout << "int value = " << aaa << '\n';
}

template<>
void function_name(double aaa)
{
std::cout << "double value = " << aaa << '\n';
}

int main()
{
int x = 3;
function_name(x);
double y = 3.5;
function_name(y);
struct Z{} z;
function_name(z);
return 0;
}
0

По вопросам рекламы [email protected]