重载函数的C ++地址

时间:2017-07-17 14:10:29

标签: c++

在我的项目中,我想做以下事情:

static void test0(void)
{
    printf("%s [%d]\n", __func__, __LINE__);
}

static void test0(int a)
{
    printf("%s [%d] %d\n", __func__, __LINE__, a);
}

static std::map<std::string, void*> initializeAddressMap()
{
    std::map<std::string, void*> addressmap;
    addressmap["test0"] = (void*) &test0;    // ERROR HERE <------
    return addressmap;
}

基本上,第三个函数返回string到函数地址的映射。但是,在这一点上,我得到一个错误address of overloaded function with no contextual type information,这也是有道理的,因为我已经重载了test0函数,此时编译器不知道要采用哪个函数的地址。有什么方法可以解决这个问题,除了调用我的函数不同的名字?

2 个答案:

答案 0 :(得分:3)

获取函数地址时应定义指针类型:

#include <iostream>

static void test(void)
{
    printf("%s [%d]\n", __func__, __LINE__);
}

static void test(int a)
{
    printf("%s [%d] %d\n", __func__, __LINE__, a);
}

int main()
{
    using t_pf1 = void (*)(void);
    using t_pf2 = void (*)(int);
    ::std::cout << (uintptr_t) t_pf1{&test} << "\n"
      << (uintptr_t) t_pf2{&test} << ::std::endl;
    return 0;
}

working code online

答案 1 :(得分:1)

最简单的解决方案是将指针存储在指针中的重载函数中,首先:

#include <cstdio>

static void test0(void)
{
    printf("%s [%d]\n", __func__, __LINE__);
}

static void test0(int a)
{
    printf("%s [%d] %d\n", __func__, __LINE__, a);
}

int main(void) {
    void (*select1)(void) = test0;  // will match void(void)
    void (*select2)(int) = test0;   // will match void(int)

    select1();
    select2(42);

    return 0;
}
  

$ ./a.out
  test0 [5]
  test0 [10] 42

如果要调用存储的void*,则必须再次将其设为函数指针。你可以通过例如reinterpret_cast<void(*)(int)>(p)