我想编写简单的模板函数,它返回给定数字的n
lsb位,其中n
是模板参数,我希望它与uint8_t, uint16_t, uint32_t, uint64_t
一起使用。所以我虽然:
template<size_t n, typename T>
inline T align_to(const T& num) {
static_assert(std::is_integral<T>::value, "integer required");
static_assert(n < sizeof(T) * 8, "overflow");
return num & (Ones(n));
}
问题是典型的用法是:
align_to<4, uint64_t>(some_uint64_t_var)
我希望编译器自动推导出类型uint64_t
,我当然希望提供n
。所以我正在寻找一种方法,编译器只推导出部分os模板arguemtns。
答案 0 :(得分:2)
您的align_to
功能会自动推断T
。可以通过将num
作为参数传递来推断:example on wandbox。
template <std::size_t n, typename T>
inline T align_to(const T& num)
{
// ...
}
int main()
{
std::int32_t x = 100;
align_to<16>(x); // `T` deduced as `std::int32_t`
}
有关规则的概述,请参阅cppreference - template argument deduction。