Я только что запутался, как реализовать что-то в 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
универсальным, чтобы избежать избыточности кода.Я могу сделать это, используя указатели функций или шаблоны.Позвольте мне выбрать последнее на данный момент. Я думаю, что это лучше, так как компилятор наверняка сможет встроить функции - я прав?Могут ли компиляторы по-прежнему выполнять вызовы, если они сделаны с помощью указателей на функции? Это дополнительный вопрос.
ОК, вернемся к исходной точке ... Решение с шаблонами:
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()
в последнем примере?
(Да, указатели на функции кажутся обходным решением в этом точномcase - при условии, что они также могут быть встроены - но я ищу общее решение для этого класса проблем).