我的问题是,我不知道如何强制编译器在不使用虚拟参数的情况下推断模板参数。这是一个无效的示例:
template<int I, class C, class T, std::size_t N>
inline typename std::enable_if<
std::is_same<C, std::array<T, N> >::value,
std::array<T, N> >::type
create_container()
{
std::array<T, N> array;
// I is used somewhere
return array;
}
这是一个工作示例:
template<int I, typename T, std::size_t N>
std::array<T, N> create_container(std::array<T, N> const&) // dummy parameter helps deduction
{
std::array<T, N> array;
// I is used somewhere
return array;
}
在第一个示例中,模板参数C
指定要实例化的容器,但在第二个示例中,函数是根据虚拟参数选择的。SFINAE 或其他一些魔法可能吗?想到了部分模板专业化,但函数模板不可能。
create_container
是这样调用的:
template <std::size_t O, typename R, typename ...A, std::size_t ...I>
inline R forward(R (*f)(A...), indices<I...>)
{
return (*f)(create_container<I + O, A>()...);
}