我的问题是,我不知道如何在不使用伪参数的情况下强制编译器推导出模板参数。这是一个不实用的例子:
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>()...);
}
答案 0 :(得分:2)
您是否只是缺少类型特征来检测C是否为std::array<T,N>
?如果是这样的话:
template< typename >
struct is_std_array : std::false_type {};
template< typename T, std::size_t N >
struct is_std_array< std::array< T, N > > : std::true_type {};
和
template<int I, typename C>
typename std::enable_if< is_std_array< C >::value, C >::type create_container()
{
C container;
// to access T and N from std::array<T,N>, use this:
typedef typename C::value_type T;
constexpr std::size_t N = container.size();
// I is used somewhere
return container;
}