我想在编译时检查一个值,如果它是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))
答案 0 :(得分:0)
可能你的问题对我来说有点不清楚。如果你想要一个字符串文字应该通过而指针不应该,那么请看下面的答案。如果您有这种感觉,我误解了您的问题,然后对其进行评论,我将删除此答案或进行相应修改。
您可以使用简单的C风格宏来检查给定变量是否为字符串文字,正如我在下面的问题的答案中所解释的那样:
Verify type of string (e.g. literal, array, pointer) passed to a function
#define IS_LITERAL(X) "" X
如果X
不是字符串文字,则编译将失败。