Saya mencoba menerapkan versi umum dari kode di bawah ini:
#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;
}
Apa yang ingin saya miliki (jika memungkinkan) adalah satu kelas templat Pekerja, yang dapat dipakai untuk bekerja di salah satu wadah, seperti:
template< ?? ptrToContainer >
class WorkerOnAnyContainer
{
public:
WorkerOnA( )
: mPtrToContainer_(ptrToContainer)
{}
void operator()()
{
std::cout << "Data = " << mPtrToContainer_->mData_ << '\n';
}
private:
?? mPtrToContainer_;
};
Namun, setelah beberapa jam, saya masih tidak tahu apa yang seharusnya menjadi '??'. Mungkin penyihir template punya ide?
Pembaruan 1: Memperbaiki kesalahan pada 'operator()' Pekerja (ptrToContainer -> mPtrToContainer_). Maaf untuk itu.
Pembaruan 2: Ada yang berfungsi, namun saya masih penasaran apakah ada yang punya ide lebih baik. Misalnya, memiliki satu parameter template akan menyenangkan. Adakah yang tahu jika "parameter templat templat" dapat membantu dalam situasi ini?
template< class TContainer, TContainer* ptrToContainer >
class Worker
{
public:
Worker( )
: mPtrToContainer_(ptrToContainer)
{}
void operator()()
{
std::cout << "Data = " << mPtrToContainer_->mData_ << '\n';
}
private:
TContainer* mPtrToContainer_;
};
Terimakasih