Tôi biết điều này là không thể trong C++ 03, nhưng tôi hy vọng có một số voodoo mới cho phép tôi làm điều này. Xem bên dưới:Có anyway trong C++ 11 để có được loại con trỏ thành viên trong một mẫu?
template <class T>
struct Binder
{
template<typename FT, FT T::*PtrTomember>
void AddMatch();
};
struct TestType
{
int i;
};
int main(int argc, char** argv)
{
Binder<TestType> b;
b.AddMatch<int,&TestType::i>(); //I have to do this now
b.AddMatch<&TestType::i>(); //I'd like to be able to do this (i.e. infer field type)
}
Có cách nào để thực hiện việc này trong C++ 11 không? Liệu decltype có giúp được không?
** UPDATE: Sử dụng ví dụ Vlad của tôi đã suy nghĩ một cái gì đó như thế này sẽ làm việc (caveat: Tôi đã không được biên dịch như tôi đang xây dựng trình biên dịch với sự hỗ trợ decltype nay)
template <class T>
struct Binder
{
template<typename MP, FT ft = decltype(MP)>
void AddMatch()
{
//static_assert to make sure MP is a member pointer of T
}
};
struct TestType
{
int i;
};
int main()
{
Binder<TestType> b;
b.AddMatch<&TestType::i>();
}
Sẽ làm việc này?
Cho rằng bạn đang xác định rõ ràng nó, tôi nghi ngờ có một cách. Nó sẽ hoạt động ngay cả trong C++ 03 nếu nó là 'AddMatch (& TestType :: i)' thay thế. –
Bạn cần làm gì với con trỏ tới thành viên? Nó có thể là có một giải pháp tốt hơn so với việc sử dụng một con trỏ tới thành viên như một tham số mẫu không kiểu. – bames53