Я просто запутался, как реализовать что-то в общем виде на С++. Это немного запутанно, поэтому позвольте мне объяснить шаг за шагом.
Рассмотрим такой код:
void a(int) {
// do something
}
void b(int) {
// something else
}
void function1() {
a(123);
a(456);
}
void function2() {
b(123);
b(456);
}
void test() {
function1();
function2();
}
Легко заметить, что function1
и function2
делают то же самое, причем единственной другой частью является внутренняя функция.
Поэтому я хочу сделать function
generic, чтобы избежать избыточности кода. Я могу сделать это с помощью указателей функций или шаблонов. Позвольте мне выбрать последнее на данный момент. Мое мышление заключается в том, что это лучше, поскольку компилятор, несомненно, сможет встроить функции - я прав? Могут ли компиляторы по-прежнему встроить вызовы, если они сделаны с помощью указателей функций? Это побочный вопрос.
ОК, вернемся к исходной точке... Решение с шаблонами:
void a(int) {
// do something
}
void b(int) {
// something else
}
template<void (*param)(int) >
void function() {
param(123);
param(456);
}
void test() {
function<a>();
function<b>();
}
Все ОК. Но я столкнулся с проблемой: могу ли я это сделать, если a
и b
являются самими генериками?
template<typename T>
void a(T t) {
// do something
}
template<typename T>
void b(T t) {
// something else
}
template< ...param... > // ???
void function() {
param<SomeType>(someobj);
param<AnotherType>(someotherobj);
}
void test() {
function<a>();
function<b>();
}
Я знаю, что параметр шаблона может быть одним из следующих:
- тип,
- тип шаблона,
- значение типа.
Никто из них, похоже, не охватывает мою ситуацию. Мой главный вопрос: Как это решить, т.е. Определить function()
в последнем примере?
(Да, указатели на функции, похоже, являются обходным путем в этом конкретном случае - при условии, что они также могут быть встроены - но я ищу общее решение для этого класса проблем).