Я только что запутался, как реализовать что-то в общем виде на C++. Это немного запутанно, поэтому позвольте мне объяснить шаг за шагом.Шаблон функции как аргумент шаблона
Рассмотрим такой код:
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, чтобы избежать избыточности кода. Я могу сделать это с помощью указателей функций или шаблонов. Позвольте мне выбрать последнее на данный момент. Мое мышление заключается в том, что это лучше, поскольку компилятор, несомненно, сможет встроить функции - я прав? Могут ли компиляторы по-прежнему встроить вызовы, если они сделаны с помощью указателей функций? Это побочный вопрос.
OK, вернуться к исходной точке ... Раствор с шаблонами:
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()
в последнем примере?
(Да, указатели на функции, похоже, являются обходным путем в этом конкретном случае - при условии, что они также могут быть встроены, но я ищу общее решение для этого класса проблем).
Не совсем уверен, почему это произошло. Это не совсем удовлетворительно, но оно решает проблему. –
Итак, чтобы подвести итог: единственное решение, позволяющее встроить вызовы, - заменить функции функторами? Думаю, немного громоздко, но вполне приемлемо. Благодаря! – Kos
Но я признаю, что я очень удивлен, когда вы сказали, что невозможно встроить адресный вызов ... Если адрес может быть определен во время компиляции равным адресу данной функции, я бы ожидал, компилятор достаточно умный. :) Strange ... – Kos