【发布时间】:2015-04-01 13:34:43
【问题描述】:
在工作中,我正在尝试将一些反思带入我们的代码库。基本上我想要实现的是在数据成员的初始化程序类型中捕获指向数据成员的指针:
template<class Class, int Class::*dataMember>
struct Reflect
{
operator int() {return 0;}
};
class Foo
{
public:
int bar = Reflect<Foo, &Foo::bar>{};
};
虽然 clang 3.4.1 (http://gcc.godbolt.org/) 和 Intel C++ XE 14.0 能够编译这段代码,但在使用 MSVC12 时,我收到以下错误消息:
错误 C2065:'bar':未声明的标识符
错误 C2975:“dataMember”:“Reflect”的模板参数无效,预期的编译时常量表达式
此外,gcc 4.9.2 似乎也有问题:http://ideone.com/ZUVOMO。
所以我的问题是:
- 上面这段代码是有效的 C++11 吗?
- 如果是,是否有针对失败编译器的解决方法?
【问题讨论】:
标签: c++ templates c++11 initializer pointer-to-member