Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用函数指针唯一标识类型_C++_C++11_Templates_Function Pointers - Fatal编程技术网

C++ 使用函数指针唯一标识类型

C++ 使用函数指针唯一标识类型,c++,c++11,templates,function-pointers,C++,C++11,Templates,Function Pointers,我需要为运行时相等性比较的类型分配唯一的值。使用函数指针作为值执行以下操作: #include <cassert> struct type_id { using value_type = void(*)(); template<class T> static void get() { } }; // some types struct A {}; struct B {}; int main() { type_id::value_type a =

我需要为运行时相等性比较的类型分配唯一的值。使用函数指针作为值执行以下操作:

#include <cassert>

struct type_id {
  using value_type = void(*)();

  template<class T>
  static void get() { }
};

// some types
struct A {};
struct B {};

int main() {
    type_id::value_type a = &type_id::get<A>;
    type_id::value_type b = &type_id::get<B>;   

    assert(a != b);

    return 0;
}
#包括
结构类型\u id{
使用值_type=void(*)();
模板
静态void get(){}
};
//某些类型
结构A{};
结构B{};
int main(){
type_id::value_type a=&type_id::get;
type_id::value_type b=&type_id::get;
断言(a!=b);
返回0;
}

我的问题是:我应该知道哪些限制(如果有的话)?我对跨多个翻译单元的唯一性和性能特别好奇。

Hi Max,我想你必须检查COMDAT折叠和弱链接(以及如何避免它)。如果你事先知道你的类型是什么,你可以在编译时分配唯一的类型。这将消除您对性能的疑虑…@JVApen谢谢,这正是我想要的推荐信。该标准强制要求函数指针对每个实例化进行不同的比较。为了避免COMDAT折叠,我可能会在函数中放入一些局部静态变量,并返回它们的地址,这样函数体就不同了,这样可能会更安全。我曾多次使用类似的技术,而且通常都是有效的。我强烈建议在函数路由中使用静态变量地址,尽管我记得在只使用函数指针的情况下,使用GCC的翻译单元中的地址不相同。最后我只使用了
void*
作为我的类型标识符。谢谢你的反馈。我最初考虑的是局部静态变量方法,直到我意识到直接使用函数指针会更有效,但我怀疑可能会有问题。。。在使用两个TU的快速测试中,似乎clang和gcc-6都给出了预期的结果。嗨,Max,我想你必须检查COMDAT折叠和弱链接(以及如何避免它)。如果你事先知道你的类型是什么,你可以在编译时分配唯一的类型。这将消除您对性能的疑虑…@JVApen谢谢,这正是我想要的推荐信。该标准强制要求函数指针对每个实例化进行不同的比较。为了避免COMDAT折叠,我可能会在函数中放入一些局部静态变量,并返回它们的地址,这样函数体就不同了,这样可能会更安全。我曾多次使用类似的技术,而且通常都是有效的。我强烈建议在函数路由中使用静态变量地址,尽管我记得在只使用函数指针的情况下,使用GCC的翻译单元中的地址不相同。最后我只使用了
void*
作为我的类型标识符。谢谢你的反馈。我最初考虑的是局部静态变量方法,直到我意识到直接使用函数指针会更有效,但我怀疑可能会有问题。。。在两个TU的快速测试中,似乎clang和gcc-6都给出了预期的结果。