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

Fab*_*bio 9 c++ templates c++98

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

extern "C" void foo(int);
extern "C" void zoo(double);
Run Code Online (Sandbox Code Playgroud)

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

我可以写:

template <typename T, void(*)(T)> struct A{ typedef T arg_t; };
Run Code Online (Sandbox Code Playgroud)

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

A<int, &foo>
Run Code Online (Sandbox Code Playgroud)

而不仅仅是

A<&foo>
Run Code Online (Sandbox Code Playgroud)

鉴于此信息嵌入在指针类型中,有没有一种方法可以静态提取?

小智 0

我不确定为什么您需要在结构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;
}
Run Code Online (Sandbox Code Playgroud)

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