我已经实现了constexpr
的编译时哈希函数,如果调用为
,该函数可以很好地工作(即在编译时求值)
constexpr auto hash = CompileTimeHash( "aha" );
但是我需要在实际代码中使用它作为函数的自变量,如
foo( CompileTimeHash( "aha" ) ); // foo is NOT constexpr
由于特定原因,我不能使用长版
constexpr auto hash = CompileTimeHash( "aha" );
foo( hash );
在短(第一种)情况下,编译器(VC ++)将不会在编译时进行哈希处理。 有什么办法可以做到这一点?
编辑:现在可以在此处找到涉及3种情况的示例: https://godbolt.org/z/JGAyuE 在所有3种情况下,只有gcc才能做到
答案 0 :(得分:7)
那么,按规则执行总是允许在运行时进行评估。但是,这样做可能很疯狂(而且非常复杂)。
强制编译器在编译时执行此操作的最佳方法,将其传递给模板参数:
一些设置:
template <auto x>
using make_integral_constant = std::integral_constant<decltype(x), x>;
template <auto x>
inline constexpr auto want_static = make_integral_constant<x>::value;
并像这样使用它:
foo( want_static<CompileTimeHash( "aha" )> );
works even without optimization,因为除非您使用解释器,否则在运行时执行它会变得很复杂,没有充分的理由。
分配constexpr
变量也应该起作用。但是实际上,在编译时不求值更容易,所以without optimization that happens anyway。
foo( []{ constexpr auto r = CompileTimeHash( "aha" ); return r; }() );
答案 1 :(得分:-1)
如果我理解正确,那么您的CompileTimeHash()
将返回int
。
那
foo( sizeof(char[CompileTimeHash( "aha" )]) );
?
很明显,如果CompileTimeHash()
仅返回正数。
如果CompileTimeHash()
返回非负数(正数或零),则可以解决零问题(C型数组的大小不可接受)加(内)和减(外)1 >
我的意思是
foo( sizeof(char[CompileTimeHash( "aha" )+1])-1u );