c++ template declaration & definition in different files.
// interface.hpp
template <typename F, typename... Args>
constexpr bool is_static_task_v =
is_invocable_r_v<void, F, Args...> && !is_invocable_r_v<int, F, Args...>;
template <class F, class... Args,
std::enable_if_t<is_static_task_v<F, Args...>, void>* = nullptr>
static void enqueue(uint32_t service_id, F&& f, Args&&... args);
// interface.cpp
template <class F, class... Args,
std::enable_if_t<is_static_task_v<F, Args...>, void>*>
void enqueue(uint32_t service_id, F&& f, Args&&... args) {
...
}
/***** explicit instantiate template ***/
template
void enqueue<>(unsigned int, void (*&&)());
when i explicit instantiate template, it's not usefull for lambada function? how to resolve?
for example
// main.cpp
void foo() {std::cout << "foo" << std::endl;}
enqueue(1,&foo) // it works
enqueue(1,[](){std::cout << "foo" << std::endl;} // it link error
I know it need to explicit instatiate template, but i don't know how to instatiate this template.
the clang error:
enqueue(uint32_t, F&&, Args&& ...) [with F = main(int, const char**)::<lambda()>; Args = {}; std::enable_if_t<is_static_task_v<F, Args ...>, void>* <anonymous> = 0; uint32_t = unsigned int]
And I instatiate template for lambda like this, it still no work:
template void enqueue<void (*)(), , (void*)0>(unsigned int,void (*&&)());