有没有办法在没有reinterpret_cast的情况下将多种类型的指针保存到函数中?

时间:2017-08-23 20:33:34

标签: c++ function-pointers reinterpret-cast

我有一些代码处理许多指向不同签名功能的指针。这是一个片段:

#include <unordered_map>

// Simple type id system
template<typename> void type_id(){}
using type_id_t = void(*)();

// value type of our map. We reinterpret functions pointer to this type
using held_type = void(*)();

// actual function type.
template<typename T>
using funct_type = T(*)();

int main() {
    std::unordered_map<type_id_t, held_type> function_map;

    function_map.emplace(type_id<int>, reinterpret_cast<held_type>(
        static_cast<func_type<int>>([]() -> int { return 42; });
    ));

    function_map.emplace(type_id<double>, reinterpret_cast<held_type>(
        static_cast<func_type<double>>([]() -> double { return 9.4; });
    ));

    // later on

    // prints 42
    std::cout << reinterpret_cast<func_type<int>>(function_map[type_id<int>])();

    // prints 9.4
    std::cout << reinterpret_cast<func_type<double>>(function_map[type_id<double>])();
}        

有没有办法在不显着开销和没有重新解释演员的情况下获得类似的结果?

1 个答案:

答案 0 :(得分:1)

如果你可以稍微修改一下你的功能,你可以通过反转流程并删除返回类型来接近它 这是我的意思的一个例子:

true

wandbox上查看并运行。

当您查询#include <unordered_map> #include <iostream> template<typename T> void call(T t, void *ptr) { *static_cast<T *>(ptr) = t; } // Simple type id system template<typename> void type_id() {} using type_id_t = void(*)(); // value type of our map. We reinterpret functions pointer to this type using held_type = void(*)(void *); // actual function type. template<typename T> using funct_type = T(*)(); int main() { std::unordered_map<type_id_t, held_type> function_map; function_map.emplace(type_id<int>, +[](void *ptr){ return call(42, ptr); }); function_map.emplace(type_id<double>, +[](void *ptr) { call(9.4, ptr); }); // prints 42 int i; function_map[type_id<int>](&i); std::cout << i << std::endl; // prints 9.4 double d; function_map[type_id<double>](&d); std::cout << d << std::endl; } 时,您可以使用变量的类型来选择正确的type_id专精。只需隐藏功能模板后面的所有内容。