函数的语言链接是其类型的一部分:
ISO C++ 标准的 7.5.1 [dcl.link]:
所有函数类型、函数名和变量名的默认语言链接是 C++ 语言链接。具有不同语言链接的两个函数类型是不同的类型,即使它们在其他方面相同。
是否可以针对函数指针的链接类型专门化模板,或者以其他方式自省函数指针的类型以确定其在编译时的链接?
第一次尝试似乎不合法:
#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 应用程序可以实现此功能?