如果可能,请在编译时检查一个值

时间:2015-12-10 22:26:01

标签: c++ c++11 c++14

我想在编译时检查一个值,如果它是constexpr值,并且如果是,则运行constexpr表单检查功能。

我可以在c ++ 11/14中这样做吗?

在伪代码中,我想做:

static_if (is_constexpr(x)) 
      static_assert(check(x))

详细信息:

我正在检查特定格式的字符串。从概念上讲:

template<std::size_t N>
constexpr bool check(const char (&s)[N]){ return true; }
//^ really a recursive call that checks the string

constexpr检查使用字符串文字,但不使用字符串指针:

int main(){
  const char* s = "#";
  static_assert(check("#"), "Fmt");; //OK

  //This fails; expectation was it suceeds and the check doesn't run
  static_assert(!is_constexpr(s) || check(s), "Fmt");

}

is_constexpr是:

#include <type_traits>
template<typename T> 
constexpr typename std::remove_reference<T>::type makeprval(T && t) {
  return t;
}
#define is_constexpr(e) noexcept(makeprval(e))

1 个答案:

答案 0 :(得分:0)

可能你的问题对我来说有点不清楚。如果你想要一个字符串文字应该通过而指针不应该,那么请看下面的答案。如果您有这种感觉,我误解了您的问题,然后对其进行评论,我将删除此答案或进行相应修改。

您可以使用简单的C风格宏来检查给定变量是否为字符串文字,正如我在下面的问题的答案中所解释的那样:
Verify type of string (e.g. literal, array, pointer) passed to a function

#define IS_LITERAL(X) "" X

如果X不是字符串文字,则编译将失败。