在工作中,我正在尝试一些,以反映我们的代码库.基本上我想要实现的是捕获数据成员的初始化器类型中的数据成员的指针:
template<class Class, int Class::*dataMember>
struct Reflect
{
operator int() {return 0;}
};
class Foo
{
public:
int bar = Reflect<Foo, &Foo::bar>{};
};
Run Code Online (Sandbox Code Playgroud)
虽然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.
所以我的问题是:
在为我正在从事的某个项目实现一个compressed_tuple类时,我遇到了以下问题:我似乎无法将这种类型的实例传递给 std::apply,尽管根据以下内容这应该是可能的:https:// en.cppreference.com/w/cpp/utility/apply。
我使用以下片段(godbolt)很容易地重现了这个问题:
#include <tuple>
struct Foo {
public:
explicit Foo(int a) : a{ a } {}
auto &get_a() const { return a; }
auto &get_a() { return a; }
private:
int a;
};
namespace std {
template<>
struct tuple_size<Foo> {
constexpr static auto value = 1;
};
template<>
struct tuple_element<0, Foo> {
using type = int;
};
template<size_t I>
constexpr auto get(Foo &t) -> int & {
return t.get_a();
}
template<size_t I> …Run Code Online (Sandbox Code Playgroud)