язык связь функция, является частью его типа:Можно ли специализировать шаблон по языковой привязке?
7.5.1 [dcl.link] из ISO C++ стандарт:
язык по умолчанию связь всех типов функций, имена функций и переменных имена - это ссылка на язык 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, которые могли бы реализовать эту функцию?
У вас есть спецификация, в которой говорится, что связь является частью информации о типе, на которой основаны шаблоны C++? –
@ НиколБолас: Нет, не знаю. Тем не менее, я думаю, что цитата в вопросе понятна: «Два типа функций с разными языковыми связями - это разные типы». И из [14.4 Типовой эквивалентности]: 'Два идентификатора шаблона относятся к одному и тому же классу или функции, если их соответствующие шаблоны-аргументы типа одного типа '. –
@NicolBolas: это будет 7.5.1, процитированное в вопросе ... –