【问题标题】:Pointer-to-member as template parameter deduction指向成员的指针作为模板参数推导
【发布时间】:2012-06-24 23:48:22
【问题描述】:

我想获取指向成员的指针作为 foo1 的模板参数。这是代码:

struct baz{
    int qux;
};

template<typename C, typename T, T C::*m>
struct foo1{};

template<typename C, typename T>
void barr2(T C::*m){
}

template<typename C, typename T>
void barr1(T C::*m){
    barr2(m); // ok
    foo1<C, T, &baz::qux> _; // ok
    foo1<C, T, m> f; // g++4.6.1 error here; how to pass 'm' correctly ?
}

int main(){
    barr1(&baz::qux);
}

那么它应该是什么样子呢?

【问题讨论】:

  • 另见my own related question。简短的回答是,据我所知,您不能便携,但如果您只想针对 GCC 或 VC++ x64,它应该可以工作。等等,没关系,你不是在做方法指针,而是在做数据成员指针。忘了我说了什么!

标签: c++ class templates parameters pointer-to-member


【解决方案1】:

它对您不起作用,因为您试图在编译时表达式中使用运行时信息。这与使用从控制台读取的整数来专门化模板相同。它不适合工作。

它不一定能解决你的问题,但如果 barr1 函数的目的是减轻打字负担,这样的事情可能对你有用:

struct baz{
    int qux;
};

template<typename C, typename T, T C::*m>
struct foo1 {};

#define FOO(Class, Member)                                  \
    foo1<Class, decltype(Class::Member), &Class::Member>

int main(){
    FOO(baz, qux) f;
}

【讨论】:

  • 我可能误解了一些东西,但这编译:http://pastebin.com/XVWzLSdR
  • 直接传参数是没有问题的。我对完全按照给定示例传递参数很感兴趣(另外,请查看上面的链接)。
  • @mirt:这正是你不能做的。指向成员的指针只是内存中的一个地址。因此,它只能在常量表达式的情况下用于特化模板。函数参数不是常量表达式。
  • 示例已更新。我仍然不明白标记为“ok”的代码和未编译的代码之间的主要区别。
  • @mirt:未编译的尝试将运行时变量作为模板参数传递。编译的没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多