ฉันกำลังพยายามใช้โค้ดเวอร์ชันทั่วไปด้านล่าง:
#include <iostream>
class ContainerA
{
public:
ContainerA( int newData )
: mData_(newData)
{}
int mData_;
};
class ContainerB
{
public:
ContainerB( int newData )
: mData_(newData)
{}
int mData_;
};
ContainerA staticInstanceA( 3 );
ContainerB staticInstanceB( 11 );
template< ContainerA* ptrToContainer >
class WorkerOnA
{
public:
WorkerOnA( )
: mPtrToContainer_(ptrToContainer)
{}
void operator()()
{
std::cout << "Data = " << mPtrToContainer_->mData_ << '\n';
}
private:
ContainerA* mPtrToContainer_;
};
template< ContainerB* ptrToContainer >
class WorkerOnB
{
public:
WorkerOnB( )
: mPtrToContainer_(ptrToContainer)
{}
void operator()()
{
std::cout << "Data = " << mPtrToContainer_->mData_ << '\n';
}
private:
ContainerB* mPtrToContainer_;
};
int main( )
{
WorkerOnA<&staticInstanceA> workerOnAInstance;
WorkerOnB<&staticInstanceB> workerOnBInstance;
workerOnAInstance();
workerOnBInstance();
return 0;
}
สิ่งที่ฉันต้องการ (ถ้าเป็นไปได้เลย) คือคลาสเทมเพลต Worker เดียว ซึ่งสามารถอินสแตนซ์ให้ทำงานบนคอนเทนเนอร์ใดก็ได้ เช่น:
template< ?? ptrToContainer >
class WorkerOnAnyContainer
{
public:
WorkerOnA( )
: mPtrToContainer_(ptrToContainer)
{}
void operator()()
{
std::cout << "Data = " << mPtrToContainer_->mData_ << '\n';
}
private:
?? mPtrToContainer_;
};
อย่างไรก็ตาม หลังจากผ่านไปหลายชั่วโมง ฉันก็ยังนึกไม่ออกว่าตัวอักษร '??' ควรเป็นอย่างไร บางทีตัวช่วยสร้างเทมเพลตอาจมีแนวคิดใช่ไหม
อัปเดต 1: แก้ไขข้อผิดพลาดใน 'ตัวดำเนินการ ()' ของผู้ปฏิบัติงาน (ptrToContainer -> mPtrToContainer_) ขอโทษสำหรับสิ่งนั้น.
อัปเดต 2: ฉันได้สิ่งที่ได้ผลแล้ว แต่ฉันก็ยังอยากรู้ว่าใครมีความคิดที่ดีกว่านี้ไหม ตัวอย่างเช่น การมีพารามิเตอร์เทมเพลตเพียงตัวเดียวก็น่าจะดี ไม่มีใครรู้ว่า "พารามิเตอร์เทมเพลตเทมเพลต" สามารถช่วยในสถานการณ์นี้ได้หรือไม่
template< class TContainer, TContainer* ptrToContainer >
class Worker
{
public:
Worker( )
: mPtrToContainer_(ptrToContainer)
{}
void operator()()
{
std::cout << "Data = " << mPtrToContainer_->mData_ << '\n';
}
private:
TContainer* mPtrToContainer_;
};
ขอบคุณ D