自动扣除部分模板类型

时间:2016-09-07 07:41:44

标签: c++ templates c++11

我想编写简单的模板函数,它返回给定数字的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。

1 个答案:

答案 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