gpt4 book ai didi

c++ - 指向模板类全局实例的指针作为模板参数?

转载 作者:行者123 更新时间:2023-11-30 03:02:26 27 4
gpt4 key购买 nike

我正在尝试实现以下代码的通用版本:

#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:修复了 Worker 的“operator()”中的错误(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_;
};

谢谢,

最佳答案

我会试一试。如何更改您的模板,以便将类型作为参数,而不是指针本身?您仍然可以传递一个指向构造函数的指针:

template< typename TContainer >
class WorkerOnAnyContainer
{
public:
WorkerOnA( TContainer* ptrToContainer )
: mPtrToContainer_(ptrToContainer)
{}

void operator()()
{
std::cout << "Data = " << mPtrToContainer_->mData_ << '\n';
}

private:
TContainer* mPtrToContainer_;
};

然后你可以像这样使用它:

WorkerOnAnyContainer<ContainerA> workerOnAInstance(&staticInstanceA);

既然你想保留指针作为模板参数的设计,你可以使用这样的东西:

template< typename TContainer, TContainer* ptrToContainer >
class WorkerOnAnyContainer
{
public:
WorkerOnA()
: mPtrToContainer_(ptrToContainer)
{}

void operator()()
{
std::cout << "Data = " << ptrToContainer->mData_ << '\n';
}

private:
TContainer* mPtrToContainer_;
};

像这样使用它:

WorkerOnAnyContainer<ContainerA, &staticInstanceA> workerOnAInstance;

但是,这有点困惑,因为您需要两个模板参数,而第一个感觉多余。我不确定是否可以用 C++03 解决这个问题,但我认为可以构建一个辅助方法来为我们在 C++11 中进行类型推导:

template<typename T>
auto CreateWorker(T* container) -> WorkerOnAnyContainer<T, container>
{
return WorkerOnAnyContainer<T, container>();
}

但是,由于编译器期望该函数适用于非编译时常量参数,因此无法编译 (GCC 4.6.3):

use of parameter 'container' outside function body

原来是you're not the only one trying to do this .显然,您不能以这种方式创建辅助方法,即使使用 C++11 也是如此。

我能想到的唯一可行的方法是使用宏(我知道,我知道):

#define CreateWorker(container) WorkerOnAnyContainer<decltype(container), &container>()

然后使用它很简单:

auto worker = CreateWorker(staticInstanceA);    // Note no `&'

这利用了 auto 和一个简单的 decltype,英特尔 C++ 编译器从 v12 开始支持的这两个 C++11 特性(虽然我还没有测试过这个使用 GCC 以外的任何代码)。作为一个宏,它当然有点脆弱。

See it in action!

关于c++ - 指向模板类全局实例的指针作为模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10163627/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com