У меня есть функция в библиотеке, которая является вариативным шаблоном и используется другой программой.
1
А.хпп
class A {
template<typename Ret,typename ... Args>
static Ret f(int id,Args&& ... args);
};
#include "A.tpl"
A.tpl
template<typename Ret,typename ... Args>
Ret A::f(int id,Args&& ... args)
{
//do somthing with args and id
Ret ret;
/// do somthing with ret
return ret;
}
Моя проблема заключается в следующем: если Ret недействителен, код неверен. Поэтому я пытаюсь построить специализацию f:
2
A.tpl
template<typename ... Args>
void A::f<void,Args ...>(int id,Args&& ... args)
{
//do somthing with args and id
return;
}
template<typename Ret,typename ... Args>
Ret A::f(int id,Args&& ... args)
{
//do somthing with args and id
Ret ret;
/// do somthing with ret
return ret;
}
Но этот код неверен.
поэтому я пытаюсь разделить код:
3
А.хпп
class A {
template<typename Ret,typename ... Args>
static Ret f(int id,Args&& ... args);
template<typname Ret>
static Ret f2();
}
#include "A.tpl"
A.tpl
template<typename Ret,typename ... Args>
Ret A::f(int id,Args&& ... args)
{
//do somthing with args and id
return f2<Ret>();
}
template<typename Ret>
Ret A::f2()
{
Ret ret;
/// do somthing with ret
return ret;
}
A.cpp
template<>
void A::f2<void>()
{
return;
}
Теперь код в порядке, и моя библиотека отлично компилируется в .so/dll.
Но когда я использую f(...), компилятор находит только f2 из "A.tpl", а не f2 в .so/dll (из .cpp). Таким образом, код недействителен (опять же), потому что ret объявлен как недействительный.
Итак, если у кого-то есть какие-либо идеи, чтобы справиться с этим ...
Редактировать
Решение:
Сделайте 3 решение и добавьте A.tpl
template<>
void A::f2<void>();
void A::f<void,Args ...>(int id,Args&& ... args)
, а неRet A::f<void,Args ...>(int id,Args&& ... args)
. - person RamblingMad   schedule 05.05.2014