Я пытаюсь реализовать общую версию кода ниже:Указатель-в-global-instance-of-template-class как шаблон-параметр?
#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_;
};
Однако, через несколько часов, я до сих пор не могу понять, что «??» s должно быть. Может быть, у мастера шаблонов есть идея?
Обновление 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
О, я вижу, мой отредактированный ответ избыточен дали ваши изменения :-) Хм. Параметры шаблона шаблона относятся к типу, который принимает параметр шаблона, и вы используете этот тип в качестве шаблона. Я не думаю, что это применимо здесь. Я попробовал написать вспомогательную функцию типа-inferring, но это не работает либо потому, что значение указателя является частью сигнатуры рабочего типа. +1, это более интересно, чем я думал. – Cameron
Вы используете C++ 11? – Cameron
@Cameron Мой «производственный» компилятор - это Intel, у которого есть некоторые возможности C++ 11: http://software.intel.com/en-us/articles/c0x-features-supported-by-intel-c-compiler/ , Какие новые функции потребуются для объединения параметров шаблона? – Dragos