有没有办法将static_assert转换为ISO C ++ 11中的表达式?

时间:2015-07-09 08:12:31

标签: c++ c++11 static-assert

在C ++ 11中,编写是合法的,例如:

int b = (some_function_returning_void(), 1020);

你会回来1020.但它不会让你写下来:

int b = (static_assert(2 > 1, "all is lost"), 304);

documentation解释了static_assert(显然可能出现keyword)的合法位置:

  

静态断言声明可能出现在块作用域(作为块声明)和类体内(作为成员声明)

只是为了它,我尝试了几件事,直到这个工作:

int b = ({static_assert(2 > 1, "all is lost"); 304;});

但是-Wpedantic我得到了"warning: ISO C++ forbids braced-groups within expressions"。有趣的是,这些被称为"语句表达式"和used in the Linux kernel

但是,让我想象一下我要留下-Wpedantic。有没有干净的解决方法?

3 个答案:

答案 0 :(得分:24)

作为评论中提到的@dyp,您可以滥用逗号运算符和lambda表达式:

([]{static_assert(true,"");}, 42)

Live on Coliru

答案 1 :(得分:9)

static_assert 表达式(与sizeof不同),因此您无法在需要表达式的地方使用它

它甚至不是void类型的表达式(有趣的是,throwvoid类型的表达式)所以你甚至不能在一个int b = []{ static_assert(2 > 1, "all is lost"); return 304; }(); 中使用它三元

语句表达式不是标准的C ++,所以我建议不要使用它们。

一个lambda

int b = ([]{static_assert(2 > 1, "all is lost");}, 304);

D_id_color = {'A': u'orchid', 'B': u'darkcyan', 'C': u'grey', 'D': u'dodgerblue', 'E': u'turquoise', 'F': u'darkviolet'}
x_coordinates = [1,2,3,4,5,6] # Added missing datapoint
y_coordinates = [3,3,3,3,3,3] # Added missing datapoint
size_map = [50,100,200,400,800,1200] # Added missing datapoint
color_map = [color for color in D_id_color.values()[:len(x_coordinates)]]
plt.scatter(x_coordinates,y_coordinates, s = size_map, c = color_map)

# The following two lines generate custom fake lines that will be used as legend entries:
markers = [plt.Line2D([0,0],[0,0],color=color, marker='o', linestyle='') for color in D_id_color.values()]
plt.legend(markers, D_id_color.keys(), numpoints=1)

plt.show()

很难干净。 (第二个lambda看起来像一个头发的宽度远离未定义)。

答案 2 :(得分:3)

功能模板怎么样:

template<int T> void my_static_assert()
{
    static_assert(T, "asserted");
}

然后您可以使用逗号运算符,甚至不需要调用函数:

int x = (my_static_assert<(2 > 1)>, 2001);

也许你需要一些括号来使解析器满意。你松开了静态断言信息,但它确实有效。