【发布时间】:2022-01-22 12:10:30
【问题描述】:
我有一个看起来像这样的函数:
template<class T, class E, class U = T> T function(T input1, E input2) {
// implementation here
}
我希望U 的默认值是一个宏,而不是上面的声明,它以T 为输入。更具体地说,如果T 是boost::multiprecision::cpp_int,我希望U 的默认值为boost::multiprecision::cpp_int,并且我希望U 的默认值为一个整数,其精度是T 的两倍,用于固定精度@ 987654330@.
我知道第二部分可以通过以下方式完成:
U = boost::uint_t<2 * std::numeric_limits<T>::digits>::fast
如何检查 T 是否为 cpp_int(或 std 和 boost 中的任何其他任意精度整数),并将所有内容放在一个宏中?
编辑:
我发现可以通过以下方式测试任意精度:
std::numeric_limits<T>::is_bounded
我仍然不知道如何将这 2 个测试组合成 1 个宏。
【问题讨论】:
-
您可以编写一个采用
boost::multiprecision::cpp_int的重载。这样编译器只会在模板上选择那个。 -
由于 E 类,重载需要模板部分特化,所以这对我不起作用。
-
不,您不必专门,只需编写另一个没有 T 或 U 的函数,并使用
boost::multiprecision::cpp_int代替它们。 -
这可行。我在其他几个模板化函数中使用了这个函数,所以我仍然需要测试这些模板的输入是否是 cpp_int/任意精度,我不知道该怎么做。但我将能够避免编写宏。
-
您是否有理由为此需要宏?
标签: c++ templates boost macros integer