2012-06-24 5 views
3

Я хочу получить указатель-член в качестве параметра шаблона в 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); 
} 

Как это должно выглядеть?

+1

Смотрите также [мой собственный связанный с ним вопрос] (HTTP : //stackoverflow.com/questions/9729438/c-pointer-to-method-template-deduction-doesnt-compile-when-targeting-x86-but). Короткий ответ заключается в том, что вы не можете сделать это * портативно *, насколько мне известно, но он должен работать, если вы просто хотите настроить GCC или VC++ x64. Подождите, неважно, вы не указали указатели на методы, а указатели элементов данных. Забудь, что я сказал что-нибудь! – Cameron

ответ

7

Это не работает для вас, потому что вы пытаетесь использовать информацию во время выполнения во время компиляции. Это то же самое, что использовать целое число, которое вы читаете с консоли, чтобы специализировать шаблон. Он не предназначен для работы.

Это не обязательно решить вашу проблему, но если цель 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; 
} 
+0

Я мог бы что-то не понимать, но это компилирует: [http://pastebin.com/XVWzLSdR] (http://pastebin.com/XVWzLSdR) – mirt

+0

Передача параметра напрямую не является проблемой. Мне интересно передавать параметр точно так же, как в данном примере (также посмотрите на ссылку выше). – mirt

+0

@mirt: Это именно то, чего вы не можете сделать. Указатель на член - это просто адрес в памяти. Таким образом, его можно использовать для специализации шаблона только в случае постоянного выражения. Аргументы функции не являются постоянными выражениями. –

Смежные вопросы