我正在尝试使用一些模板元编程来设置计时器类的分辨率。这是一个让我有点难过的问题。作为参数传递的布尔表达式被忽略。
// Boolean SFINAE struct for partial specialization selection.
template< bool T > struct SFINAE_void;
template<> struct SFINAE_void< true > { using type = void; };
template<> struct SFINAE_void< false > {};
/* Precision selector */
template< std::intmax_t , std::intmax_t , typename=void >
struct ChosenResolution;
template< std::intmax_t NUM, std::intmax_t DEN >
struct ChosenResolution< NUM, DEN,
typename SFINAE_void<
( real_cast(NUM)/real_cast(DEN) < real_cast(1.0) &&
real_cast(NUM)/real_cast(DEN) >= real_cast(10^-3) ) >::type > {
using type = std::chrono::milliseconds;
};
template< std::intmax_t NUM, std::intmax_t DEN >
struct ChosenResolution< NUM, DEN,
typename SFINAE_void<
( real_cast(NUM)/real_cast(DEN) < real_cast(10^-3) &&
real_cast(NUM)/real_cast(DEN) >= real_cast(10^-6) ) >::type > {
using type = std::chrono::microseconds;
};
template< std::intmax_t NUM, std::intmax_t DEN >
struct ChosenResolution< NUM, DEN,
typename SFINAE_void<
( real_cast(NUM)/real_cast(DEN) < real_cast(10^-6) &&
real_cast(NUM)/real_cast(DEN) >= real_cast(10^-9) ) >::type > {
using type = std::chrono::nanoseconds;
};
调试输出显示分辨率为10^-9
。但是,std::chrono::milliseconds
被选为分辨率,而不是std::chrono::nanoseconds
。
两个问题:
1。)为什么?
2。)略有分歧 - 但是普通的日常笔记本电脑真的可以夸耀纳秒分辨率(我使用的是稳定的时钟)吗?
答案 0 :(得分:1)
正如skypjack所说,我们需要real_cast()
的定义。
但我怀疑你的问题不是关于SFINAE,而是关于数字操作。
您认为10^-3
是什么?
您是否认为,与LaTeX一样,10
被提升为-3
?
那是浮点数0.001
?
没有
它是整数之间的xor
位到位操作。
因此10^-3
为-9
,10^-6
为-16
,10^-9
为-3
。
一个例子
#include <iostream>
int main()
{
std::cout << (10^-3) << std::endl; // print -9
std::cout << (10^-6) << std::endl; // print -16
std::cout << (10^-9) << std::endl; // print -3
}
无论如何......如果我没错,你就不需要SFINAE_void
;您可以将std::enable_if
与默认类型参数一起使用。