小编Eri*_*ing的帖子

内联成员初始化程序包含指向成员的指针

在工作中,我正在尝试一些,以反映我们的代码库.基本上我想要实现的是捕获数据成员的初始化器类型中的数据成员的指针:

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.

所以我的问题是:

  1. 上面的代码是有效的C++ 11吗?
  2. 如果是,那么失败的编译器是否有任何解决方法?

c++ templates initializer pointer-to-member c++11

7
推荐指数
1
解决办法
183
查看次数

无法对用户定义类型使用 std::apply

在为我正在从事的某个项目实现一个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)

c++ tuples c++17 stdapply

5
推荐指数
1
解决办法
568
查看次数