布尔表达式作为模板参数

时间:2017-05-21 07:54:58

标签: c++ c++11 template-specialization sfinae boolean-expression

我正在尝试使用一些模板元编程来设置计时器类的分辨率。这是一个让我有点难过的问题。作为参数传递的布尔表达式被忽略。

// 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。)略有分歧 - 但是普通的日常笔记本电脑真的可以夸耀纳秒分辨率(我使用的是稳定的时钟)吗?

1 个答案:

答案 0 :(得分:1)

正如skypjack所说,我们需要real_cast()的定义。

但我怀疑你的问题不是关于SFINAE,而是关于数字操作。

您认为10^-3是什么?

您是否认为,与LaTeX一样,10被提升为-3

那是浮点数0.001

没有

它是整数之间的xor位到位操作。

因此10^-3-910^-6-1610^-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与默认类型参数一起使用。