c++ - 从函数指针静态推断标准 C++98 中的函数类型参数

标签 c++ templates c++98

我有一个导出一元函数的共享库,例如:

extern "C" void foo(int);
extern "C" void zoo(double);

该库由不支持 C++11 的编译器使用。我想从函数名称静态推断结构中的函数类型。

我会写:

template <typename T, void(*)(T)> struct A{ typedef T arg_t; };

为此,我必须在实例化模板时显式指定类型 T,即我必须编写

A<int, &foo>

不仅仅是

A<&foo>

鉴于此信息嵌入在指针类型中,是否有静态提取的方法?

最佳答案

我不确定为什么您只需要在结构 A 中定义一个新类型。 假设它内部有一个类型为 T 的变量 v。 在这种情况下,我会像这样使用 C++ 函数重载功能:

#include <stdio.h>

extern "C"
{
    void foo(int x) { printf("foo(%i)\n", x); }
    void zoo(double x) { printf("zoo(%f)\n", x); }
}


template <typename T> struct A { typedef T arg_t; arg_t v; };


void foo_zoo(int x) { foo(x); }
void foo_zoo(double x) { zoo(x); }
void foo_zoo(A<int> x) { foo(x.v); }
void foo_zoo(A<double> x) { zoo(x.v); }


int main(int argc, char **argv)
{
    int xi = 1;
    double xd = 2.0;

    A<int> ai; ai.v = 10;
    A<double> ad; ad.v = 20.0;

    foo_zoo(xi);
    foo_zoo(xd);

    foo_zoo(ai);
    foo_zoo(ad);

    return 0;
}

在这种情况下,编译器/链接器将使用正确版本的 foo_zoo 函数,而不会产生任何运行时开销。如果需要,foo_zoo 的未使用版本可能会被链接丢弃。

关于c++ - 从函数指针静态推断标准 C++98 中的函数类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48146381/

相关文章:

c++ - 有关扩展类(class)能力的最佳方法的建议

c++ - 如何为多个流操作创建别名?

c++ - 如何创建最大仿函数?

c++ - 将函数绑定(bind)到类型的更好语法?

c++ - gets() 不允许先执行法院

C++递归模板类型推导

c++ - VCRUNTIME140_1.dll报告丢失,尽管已卸载VCRuntime 2015-2019并重新安装了VCRuntime 2015

c++ - LZW减压

c++ - C++ 的通用线程 C 包装器函数

java - 不同Java类型删除和泛型类型格式的优势