Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指向成员作为模板参数的指针_C++_Class_Templates_Parameters_Pointer To Member - Fatal编程技术网

C++ 指向成员作为模板参数的指针

C++ 指向成员作为模板参数的指针,c++,class,templates,parameters,pointer-to-member,C++,Class,Templates,Parameters,Pointer To Member,我想将指向成员的指针作为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){ b

我想将指向成员的指针作为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);
}
structbaz{
int-qux;
};
模板
结构foo1{};
模板
第2节(T C::*m){
}
模板
无效1(TC::*m){
barr2(m);//好的
foo1;//好的
foo1 f;//g++4.6.1此处出现错误;如何正确传递“m”?
}
int main(){
barr1(&baz::qux);
}

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

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

它不一定能解决您的问题,但如果
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;
}
structbaz{
int-qux;
};
模板
结构foo1{};
#定义FOO(类、成员)\
foo1
int main(){
富(巴兹,库克斯)f ;;
}

另请参见。简单的回答是,据我所知,您无法实现可移植性,但如果您只想针对GCC或VC++x64,它应该可以工作。等等,不管怎样,你不是在做方法指针,而是在做数据成员指针。忘了我说过什么!我可能误解了一些东西,但这是正确的:直接传递参数不是问题。我对传递参数很感兴趣,就像在一个给定的例子中一样(另外,请看上面的链接)。@mirt:这正是你不能做的。指向成员的指针只是内存中的一个地址。因此,它只能用于在常量表达式的情况下专门化模板。函数参数不是常量表达式。示例已更新。我仍然不理解标记为“ok”的代码和未编译的代码的主要区别。@mirt:未编译的代码尝试将运行时变量作为模板参数传递。不编译的不编译。