我想以便携的方式使用constexpr
,<cmath>
,exp
等标准log
版本的pow
版本。我目前有一个不可移植的解决方案g++
treats these functions as constexpr
- a non-compliant extension of C++,但我担心可移植性和面向未来(我想这个扩展可能会在某一天从g++
中删除。)
我对这些函数的constexpr
版本感兴趣,而不是模板元程序 - 我希望在编译时和运行时都能使用相同的功能。我不需要C兼容性,但我确实需要快速实现 - 像Taylor系列扩展这样的天真实现会太慢。
如何实施此类功能?我对exp
,log
和pow
我从研究中学到的一些切向相关的事情
constexpr
,因为它们必须具有副作用(例如设置errno
)以维持C兼容性constexpr
,但从C ++ 14开始,这是禁止的(每the first answer to this question和the answer to this question)。这是我担心constexpr
g++
的部分原因
g++
每个数学函数foo
的实现只调用内置函数__builtin_foo
,该函数被视为constexpr
。我或许可以开始调用__builtin_foo
函数而不是foo
函数 - 即使相应的constexpr
函数是g++
,这些函数在foo
的未来版本中仍可能<bean name="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/hibernate_db" />
<property name="username" value="my_local_username" />
<property name="password" value="my_local_password" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource" />
<property name="packagesToScan" value="com.fr.business.entites" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
符合标准 - 但这只有助于未来验证,而不是便携性。答案 0 :(得分:2)
您曾经看过Sprout的实现吗?
Sprout是仅标头的库,它提供基于C ++ 11/14 constexpr的容器,算法,随机数,解析,光线跟踪,合成器等。
https://github.com/bolero-MURAKAMI/Sprout/tree/master/sprout/math
答案 1 :(得分:2)
签出gcem
,它提供了编译时数学函数。可以像std
中的名称一样调用它们,但使用gcem
前缀。