我想实现下面的代码的通用版本:指向全局实例的模板类作为模板参数?
#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;
}
我想有(如果这是可能的),是一个工人模板类,它可以被实例化工作在任一容器上,例如:
template< ?? ptrToContainer >
class WorkerOnAnyContainer
{
public:
WorkerOnA()
: mPtrToContainer_(ptrToContainer)
{}
void operator()()
{
std::cout << "Data = " << mPtrToContainer_->mData_ << '\n';
}
private:
?? mPtrToContainer_;
};
但是,几个小时后,我仍然无法确定'??'应该是什么。也许模板向导有一个想法?
更新1:修复了工人(ptrToContainer - > mPtrToContainer_)的'operator()'中的错误。对不起。
更新2:我得到了一些工作,但我仍然会好奇,如果任何人有更好的主意。例如,拥有一个模板参数会很好。有谁知道如果“模板模板参数”可以在这种情况下帮助吗?
template< class TContainer, TContainer* ptrToContainer >
class Worker
{
public:
Worker()
: mPtrToContainer_(ptrToContainer)
{}
void operator()()
{
std::cout << "Data = " << mPtrToContainer_->mData_ << '\n';
}
private:
TContainer* mPtrToContainer_;
};
感谢, d
哦,我看到我的编辑答案是多余,你的编辑:-)嗯。当你有一个接受模板参数的类型时,template-template参数是适用的,并且你使用该类型作为模板。我认为这不适用于此。我试着编写一个类型推断帮助函数,但是这不起作用,因为指针值是工作人员类型签名的一部分。 +1,这比我第一次想到的更有趣。 – Cameron 2012-04-15 18:43:19
你使用C++ 11吗? – Cameron 2012-04-15 18:45:26
@Cameron我的“生产”编译器是Intel的,它具有一些C++ 11功能:http://software.intel.com/en-us/articles/c0x-features-supported-by-intel-c-compiler/ 。组合模板参数需要哪些新功能? – Dragos 2012-04-15 19:06:38