псевдоним шаблона функции

Я создал диспетчер ЦП, который компилирует одни и те же функции с разными параметрами компиляции в разные объектные файлы. Чтобы мой код имел доступ к одним и тем же функциям в разных объектных файлах, мне нужно присвоить функциям в каждом объектном файле другое имя.

В C (или C ++) я бы сделал что-то подобное в заголовочном файле для объявлений функции.

typedef float MyFuncType(float a);

MyFuncType  myfunc_SSE2, myfunc_SSE41, myfunc_AVX, myfunc_AVX2, myfunc_AVX512

Но теперь я хочу шаблоны функций для объявлений. Мой настоящий код в настоящее время выглядит примерно так

//kernel.h
template <typename TYPE, unsigned N, typename VALUES>
void foo_SSE2(int32_t *buffer, VALUES & v);

template <typename TYPE, unsigned N, typename VALUES>
void foo_SSE41(int32_t *buffer, VALUES & v);
...
template <typename TYPE, unsigned N, typename VALUES>
void foo_AVX512(int32_t *buffer, VALUES & v);

#if   INSTRSET == 2                    // SSE2
#define FUNCNAME foo_SSE2
#elif INSTRSET == 5                    // SSE4.1
#define FUNCNAME foo_SSE41
...
#if   INSTRSET == 9                    // AVX512
#define FUNCNAME foo_AVX512
#endif

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

//kernel.cpp
#include "kernel.h"
template<typename TYPE, unsigned N, typename VALUES>
void FUNCNAME(int32_t *buffer, VALUES & v) {
    //code
}

Затем я собираю так

gcc -c -O3 -msse2 kernel.cpp -o kernel_sse2.o
gcc -c -O3 -msse4.1 kernel.cpp -o kernel_sse41.o
...
gcc -c -O3 -mavx512f kernel.cpp -o kernel_avx512.o
gcc -O3 main.cpp kernel_sse2.o kernel_sse41.o ... kernel_avx512.o

Файлmain.cpp это другой исходный файл, который должен знать только объявления функций, чтобы компоновщик мог связать их с определениями в других объектных файлах. Это выглядит так

void dispatch(void) {
    int iset = instrset_detect();
    if (iset >= 9) {
        fp_float1  = &foo_AVX512<float,1>;  
    }
    else if (iset >= 8) {
        fp_float1  = &foo_AVX2<float,1>;
    }
    ...
    else if (iset >= 2) {
        fp_float1  = &foo_SSE2<float,1>;
    }
}
int main(void) {
    dispatch();
    fp_float1(buffer, values);
}

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

template <typename TYPE, unsigned N, typename VALUES>
typedef void foo(int32_t *buffer, VALUES & v);

foo foo_SSE2, foo_SSE41, foo_SSE_AVX, foo_AVX2, foo_AVX512

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

Ответы на вопрос(1)

Ваш ответ на вопрос