Is there any way to emulate compile-time double constant with MSVS2015?
我知道MSVS2013(甚至CTP)无法处理static constexpr double数据成员,正如在这个问题中确认的那样。
现在,我希望MSVS2015预览版至少能让我使用这个简单的构造,但遗憾的是,我得到了同样的错误。那么,合乎逻辑的下一个问题是:有没有办法用MSVC2015定义编译时双常量?
例子:
1 2 3 4 5
| template<typename T>
struct my_constant
{
static constexpr const T value = 42;
} |
这就产生了错误:
1
| error C2864: 'my_constant<double>::value': a static data member with an in-class initializer must have non-volatile const integral type |
这是C++ 03 MunBo巨无霸。
- 错误是什么?您是否错过了将变量名放在t后面?
- @我在这里做的是Jagannath,现在修复了,并添加了错误。
- 向我们展示为什么明显的替代方案,const T value = 42;不能工作。
- @汉斯,也不会工作,因为MSVC只允许积分类型,如错误所示。出于性能方面的考虑,我需要编译时评估(因为真正的代码是计算中间变量,而不是设置一个简单的常量)。这里讨论的代码是这个FFT的最终版本。
- 预览版不是最终产品。您可以在VisualC++团队的博客中找到支持的特性,包括对什么是或不支持什么的注释。
- 嗯,不,在VS2013上可以。试试看。
- @Hanspassant我不喜欢:rexteter.com/nwmti8174
- 我想你不是在用C++ 11编译。
- @Tenfour:它是MSVC,它编译任何它编译的东西,没有-std选项。
- @汉斯,我不想在任何地方创造任何东西…
- 清除重复项是链接器的工作。
- @Rubenvb Mingw和/或ICC-学习它,热爱它,像你自己一样拥抱它。:p尽管如此,您为什么想要这个FFT代码?它是用于生产还是用于玩具项目?
- 一个constexpr函数会起作用吗?
- @迈克,是的,我想这就是我需要的。回顾原始代码,这就是在那里使用的(可能是为了解决这个限制)。我只是想尽可能地简化代码(创建一个常量,好吧,一个常量,而不是一个函数)。回答这个问题,我会接受的。
- @Hanspassant,我认为您要求不使用static进行编译,而rubenvb根据他的示例代码使用static进行编译,这就是错误的原因。但是,这会给对象增加一个额外的变量,其大小为int。我建议,如果在类型之间需要EDOCX1(或任何整数),那么为什么不能简单地用static int const value = 42;编译呢?
- 我正在尝试将它转换成适合C++的AMP格式,它最近在HSA和OpenCL之上得到了一个开源的实现,使用它来代替直接在OpenCL上进行黑客攻击是很有意思的。所以一个玩具项目,可能只是有用的。但目前,MSVC是必需的。我可能只是用最新版本的C++ 11功能集而不用哭太多。
- @适用于整型的iammilid,但不适用于float(这是我在实际代码中需要的)。这个例子只是一个简化版的实际问题,供你们解决这个问题。
- 是的,我认为您必须有各种类型的需求,但从您的问题来看,很难弄清楚,因为(1)您使用的是42,而不是42.1,这将对您想要的内容给出一点提示(2)很难了解如何在template class中为不同的类型初始化值。类型??这让我认为您想要所有类型的单一值。即使是一个全局变量也足够了。
如果编译器接受constexpr成员函数
1
| static constexpr T value() {return 42;} |
那就给你一个简单的时间常数。
我从不使用这个编译器所以不能测试这个
- 我需要验证代码结果是否为常量,但至少可以编译它。谢谢。