Я новичок в вариативных шаблонах на C++, поэтому этот вопрос может показаться чем-то вроде noobish для опытных парней здесь.C++ variadic templates - NULL преобразуется в int
То, что я пытаюсь сделать, это создать proxy function
, который сможет перенаправить мои аргументы на любую другую функцию, используя вариативные шаблоны.
Мой код выглядит следующим образом:
template <typename Ret, typename ... Types>
Ret proxy_function(Types ... args)
{
return MessageBoxA(args...);
}
int main(int argc, char* argv[])
{
boost::any retval = proxy_function<boost::any>(NULL, "123", "456", 0);
}
На компиляции, компилятор выводит следующее сообщение об ошибке:
1>Main.cpp(107): error C2664: 'int MessageBoxA(HWND,LPCSTR,LPCSTR,UINT)' : cannot convert argument 1 from 'int' to 'HWND'
Однако, когда я поставляю следующий код работает просто отлично:
template <typename Ret, typename ... Types>
Ret proxy_function(Types ... args)
{
return MessageBoxA(NULL, args...);
}
int main(int argc, char* argv[])
{
boost::any retval = proxy_function<boost::any>("123", "456", 0);
}
Есть ли какая-либо причина в мире, почему компилятор не сможет применить его к типу HWND?
И еще один вопрос, который я имею в виду, прямо сейчас связанный с этой проблемой. Возможно ли определить тип аргументов внутри функции? Я хотел бы быть в состоянии сделать этот материал:
template <typename Ret, typename ... Types>
Ret proxy_function(Types ... args)
{
psuedo-code:
for arg in args:
do_stuff<type(arg)>(arg);
}
Спасибо заранее, Aviv
Использование 'nullptr'. Вот почему он существует. – chris
Ну, для моего первого вопроса - NULL определяется также как 0, а также как (void *) 0, поэтому эти два типа не совместимы с HWND. быстрое решение этой проблемы может быть: INT основной (интермедиат ARGC, символ * ARGV []) { повышение :: любой RetVal = proxy_function ((HWND) 0, "123", "456", 0); } , но я хочу заставить мой компилятор АВТОМАТИЧЕСКИ преобразовать 0 в HWND с помощью reinterpret_cast. –
CodeNinja
Если у вас есть два вопроса, почему бы не задать два разных вопроса? – Yakk