Вы можете использовать перегрузку функций в стиле C.
// in .cpp
extern "C" void func_short();
extern "C" void func_int();
extern "C" void func_float();
int main(){
func_float();
}
// in .cu
template <typename T>
void func() {
// ...
}
extern "C" void func_short() {
func<short>();
}
extern "C" void func_int() {
func<int>();
}
extern "C" void func_float() {
func<float>();
}
Это значительно быстрее, чем сравнение строк при каждом вызове функции.Если вы хотите, вы можете создать функцию шаблона оболочки на стороне C ++, чтобы сделать использование немного чище.
// in .cpp
extern "C" void func_short();
extern "C" void func_int();
extern "C" void func_float();
template <typename T>
void func() = delete;
template <>
void func<short>() {
func_short();
}
template <>
void func<int>() {
func_int();
}
template <>
void func<float>() {
func_float();
}
int main(){
func<float>();
}
Чтобы сделать обслуживание немного проще, вы можете определить некоторые макросы.
// in .cpp
template <typename T>
void func() = delete;
#define DECLARE_FUNC(TYPE) \
extern "C" void func_##TYPE(); \
template <> \
void func<TYPE>() { \
func_##TYPE(); \
} \
DECLARE_FUNC(short)
DECLARE_FUNC(int)
DECLARE_FUNC(float)
int main(){
func<float>();
}
//in .cu
template <typename T>
void func() {
// ...
}
#define DECLARE_FUNC(TYPE) \
extern "C" void func_##TYPE() { \
func<TYPE>(); \
}
DECLARE_FUNC(short)
DECLARE_FUNC(int)
DECLARE_FUNC(float)
Вы можете поместить эти строки DECLARE_FUNC
в общий заголовок, чтобы обновлять список только в одном месте.Если вы хотите добавить функцию double
, вы можете просто добавить DECLARE_FUNC(double)
к заголовку.
// in declare_func.hpp
DECLARE_FUNC(short)
DECLARE_FUNC(int)
DECLARE_FUNC(float)
// in .cpp
template <typename T>
void func() = delete;
#define DECLARE_FUNC(TYPE) \
extern "C" void func_##TYPE(); \
template <> \
void func<TYPE>() { \
func_##TYPE(); \
} \
#include "declare_func.hpp"
int main(){
func<float>();
}
//in .cu
template <typename T>
void func() {
// ...
}
#define DECLARE_FUNC(TYPE) \
extern "C" void func_##TYPE() { \
func<TYPE>(); \
}
#include "declare_func.hpp"
Я прошел путь от простого в настройке до простого в обслуживании.Вам придется решить, что подходит для вашей ситуации.