Я пытаюсь написать некоторую функциональность, где мне нужно сохранить различные функции, а затем извлечь их типы аргументов. Поэтому я использую подпись функции как параметр шаблона. Но я получаю несколько неожиданные результаты. Вот код:Почему эти случаи C++ создают экземпляры разных шаблонов
#include <functional>
#include <iostream>
template <class T>
struct foo
{
foo()
{
std::cout << "class T" << std::endl;
}
};
template <class Ret, class Arg>
struct foo<Ret(Arg)>
{
foo()
{
std::cout << "Ret(Arg)" << std::endl;
}
};
template <class T>
void save(std::function<T>)
{
new foo<T>();
}
int main(int argc, char* argv[])
{
std::function<void(void)> someFoo;
save(someFoo);
return 0;
}
Так что, если переменная someFoo
функция с типом void(void)
, он конкретизирует первый шаблон, foo<T>
. Но если я изменю его на void(int)
, я получаю желаемый специализированный шаблон, созданный. Почему это?
'void (void)' такое же, как 'void()'. Второй параметр специализации нельзя сопоставить, чтобы он возвращался к основному шаблону. – 0x499602D2
Можете проверить: http://stackoverflow.com/questions/693788/c-void-arguments –