gpt4 book ai didi

c++ - 是否可以将模板专门用于语言链接?

转载 作者:可可西里 更新时间:2023-11-01 17:52:00 36 4
gpt4 key购买 nike

函数的语言链接是其类型的一部分:

ISO C++标准的7.5.1 [dcl.link]:

The default language linkage of all function types, function names, and variable names is C++ language linkage. Two function types with different language linkages are distinct types even if they are otherwise identical.

是否可以根据函数指针的链接类型专门化模板,或者以其他方式内省(introspection)函数指针的类型以确定其在编译时的链接?

第一次尝试似乎不合法:

#include <iostream>
#include <typeinfo>

struct cpp {};
struct c {};

extern "C++" void foo()
{
std::cout << "foo" << std::endl;
}

extern "C" void bar()
{
std::cout << "bar" << std::endl;
}

template<typename> struct linkage;

template<>
struct linkage<void(*)()>
{
typedef cpp type;
};

template<>
struct linkage<extern "C" void(*)()>
{
typedef c type;
}


int main()
{
std::cout << "linkage of foo: " << typeid(linkage<decltype(&foo)>::type).name() << std::endl;
std::cout << "linkage of bar: " << typeid(linkage<decltype(&bar)>::type).name() << std::endl;
return 0;
}

g++-4.6 输出:

$ g++ -std=c++0x test.cpp 
test.cpp:26:38: error: template argument 1 is invalid
test.cpp:26:3: error: new types may not be defined in a return type
test.cpp:26:3: note: (perhaps a semicolon is missing after the definition of ‘<type error>’)
test.cpp:32:10: error: two or more data types in declaration of ‘main’

是否有SFINAE的一些应用程序可以实现这个功能?

最佳答案

是的,我相信您应该能够根据 C++ 标准根据模板的语言链接专门化模板。我用 Comeau compiler online 测试了以下代码并且编译没有错误:

#include <iostream>
#include <typeinfo>

struct cpp {};
struct c {};

extern "C++" typedef void(*cppfunc)();
extern "C" typedef void(*cfunc)();

extern "C++" void foo()
{
std::cout << "foo" << std::endl;
}

extern "C" void bar()
{
std::cout << "bar" << std::endl;
}

template<typename> struct linkage;

template<>
struct linkage<cppfunc>
{
typedef cpp type;
};

template<>
struct linkage<cfunc>
{
typedef c type;
};


int main()
{
std::cout << "linkage of foo: " << typeid(linkage<decltype(&foo)>::type).name() << std::endl;
std::cout << "linkage of bar: " << typeid(linkage<decltype(&bar)>::type).name() << std::endl;
return 0;
}

不过,我相信due to a gcc bug , gcc 不区分基于语言链接的函数类型,所以这对 gcc 来说是不可能的(而且似乎不确定他们什么时候会解决这个问题)。

关于c++ - 是否可以将模板专门用于语言链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12868383/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com