首页 > 解决方案 > 使用 C 链接在函数内部创建 C++ 模板

问题描述

myLib考虑一个写入的共享库C++11和一个调用. 但是,它是由不同的编译器编译的,因此两者使用 C 链接链接在一起,而头文件 for负责处理。一旦进入,我想使用模板来享受尽早在代码中的特权。有没有一种方法可以避免在全局命名空间中为所有支持的类型使用单独的函数?我可以控制两者的源代码。myExeC++17myLibmyExemyLibmyLibC++

例如,在里面myLib,我想避免:

// Exported function for int
void myCLinkedFuncForInt(int A)
{
    // templated C++ internal function for myLib
    myLib::myFunc(A);
}

// Exported function for float
void myCLinkedFuncForFloat(float A)
{
    // templated C++ internal function for myLib
    myLib::myFunc(A);
}

我定义myLib::myFunc为模板的地方。

我尝试过一些有趣但不安全的事情:

void myCLinkedFuncForEverything(void* A, const char* type)
{
    const std::string CppType(type);

    if (CppType == "int")
        return myLib::myFunc(*(reinterpret_cast<int*>(A));
    if (CppType == "float")
        return myLib::myFunc(*(reinterpret_cast<float*>(A));

    // If we reached here, we are unsupported
    std::cout << "Data type not supported" << std::endl;
}

然后在myExe,我把所有东西都投给了avoid*和supply type。我还有什么其他选择C++11

注意: std::variantstd::any进来了C++17

标签: c++

解决方案


有没有一种方法可以避免在全局命名空间中为所有支持的类型使用单独的函数?

不,因为您要做的是为每种此类类型实例化模板,并使其可从 C 中使用,因此您必须为每种类型定义它。


推荐阅读