- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
请耐心等待我转储以下简化代码:(我将在下面描述问题。)
class CMyClass
{
...
private:
HRESULT ReadAlpha(PROPVARIANT* pPropVariant, SomeLib::Base *b);
HRESULT ReadBeta(PROPVARIANT* pPropVariant, SomeLib::Base *b);
typedef HRESULT (CMyClass::*ReadSignature)(PROPVARIANT* pPropVariant, SomeLib::Base *b);
HRESULT TryFormats(ReadSignature ReadFormat, PROPVARIANT* pPropVariant);
};
inline HRESULT CMyClass::ReadAlpha(PROPVARIANT* pPropVariant, SomeLib::Base *b)
{
if (b)
{
// got a valid Base. Handle generic stuff here.
SetStuff(pPropVariant, b->someInt);
return S_OK;
}
return (b != NULL) ? 0 : -1;
}
inline HRESULT CMyClass::ReadBeta(PROPVARIANT* pPropVariant, SomeLib::Base *b)
{
if (b)
{
SomeLib::FormatA *fa;
SomeLib::FormatB *fb;
if ( fa = dynamic_cast<SomeLib::FormatA*>( b ) )
{
// specific code for FormatA
SetStuff(pPropVariant, fa->getVersion());
return S_OK;
}
else if ( fb = dynamic_cast<SomeLib::FormatB*>( b ) )
{
// specific code for FormatB
SetStuff(pPropVariant, fb->valueForB);
return S_OK;
}
}
return (b != NULL) ? 0 : -1;
}
inline HRESULT CMyClass::TryFormats(ReadSignature ReadFormat, PROPVARIANT* pPropVariant)
{
HRESULT hr;
if (FAILED(hr = (this->*ReadFormat)(pPropVariant, _pFile->formatA())))
if (FAILED(hr = (this->*ReadFormat)(pPropVariant, _pFile->formatC())))
hr = (this->*ReadFormat)(pPropVariant, _pFile->formatD());
return hr;
}
我最终像这样调用这段代码:
hr = TryFormats(&CMyClass::ReadAlpha, pPropVar);
现在...问题是这太笼统和受限了,尤其是现在我正在尝试重构此代码以用于其他一些项目。所以,这意味着我想放置 ReadXxx
另一个源文件中的代码并以某种方式滥用模板。 TryFormats
留在类里面,因为不同的类(class)有不同的阅读格式。
由于 dynamic_cast<Derived*>
,我目前的方法注定会失败Base
中没有的功能需要类,并且由于我可能需要在一节课中阅读多达 5 种不同的格式,所以我真的不想拖入我一开始不需要的格式。 (例如,参见上面的 CMyClass
不支持 SomeLib::FormatB
,但 ReadBeta()
需要支持它,从而强制编译器编译所有相关信息。)总共,我有大约 10 种不同的格式像这样'支持'。
如何正确重构这段代码?我不想重写 Base
每个后代的功能,我也不想将派生的特定信息放入只接受 Base
的函数中.
我已经尝试了一些东西,但我设法从我的编译器中挤出的是错误的彩虹。为了不让这里的人对我的尝试感到困惑,我想我会给出我的(简化的)原始工作代码,并让专家们就如何做到这一点得出他们自己的结论。实际上,其中大约有 50 个 ReadXxx
功能,但它们要么遵循 ReadAlpha
的一般结构或 ReadBeta
以上功能。因此,如果有人可以告诉我如何执行这些操作,我就可以毫无问题地转换我的实际代码。 (我想我也需要更改 TryFormats()
定义,这也没问题 - 我只是希望有人能告诉我如何正确重构上述示例。)
谢谢,对于这个很长很长的问题,我深表歉意。
最佳答案
好吧,我之前的visitor
方法已经成为历史。我将向您发布您可以使用的小型工作程序的完整文本。假设
_pFile->formatA()
_pFile->formatC()
_pFile->formatD()
全部声明为
FormatA* formatA()
FormatC* formatC()
FormatD* formatD()
换句话说,返回类型在编译时是已知的,这种模板化的方法可能适合你。而且它既不涉及函数指针也不涉及动态向下转型
//////////////////////////////////////////////////////////////////
// this section is for testing
class Base
{
public:
void ExecuteBase()
{
cout << "Executing Base" << endl;
}
};
class FormatA : public Base
{
public:
void ExecuteAAlpha()
{
cout << "Executing A Alpha" << endl;
}
void ExecuteABeta()
{
cout << "Executing A Beta" << endl;
}
};
class FormatB : public Base
{
public:
void ExecuteBAlpha()
{
cout << "Executing B Alpha" << endl;
}
void ExecuteBBeta()
{
cout << "Executing B Beta" << endl;
}
};
FormatA* GetFormatA()
{
static FormatA cl;
return &cl;
}
FormatB* GetFormatB()
{
static FormatB cl;
return &cl;
}
//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
// now begins real code
struct AlphaReader {};
struct BetaReader {};
template <typename READER_TYPE> struct TypeConverter {};
class MyClass
{
public:
template <typename READER_TYPE>
int TryFormats(const READER_TYPE&)
{
TryFormatsImplementation(TypeConverter<READER_TYPE>(), GetFormatA());
TryFormatsImplementation(TypeConverter<READER_TYPE>(), GetFormatB());
return 0;
}
private:
int TryFormatsImplementation(const TypeConverter<AlphaReader>&, Base* pFormat)
{
// here you will call you ReadAlpha which requires Base only
// code below is for testing
cout << "Executing Alpha Reader for Base" <<endl;
pFormat->ExecuteBase();
return 1;
}
int TryFormatsImplementation(const TypeConverter<BetaReader>&, FormatA* pFormat)
{
// here you will call you ReadBeta for FromatA,
// code below is for testing
cout << "Executing Beta Reader for FormatA" <<endl;
pFormat->ExecuteABeta();
return 3;
}
int TryFormatsImplementation(const TypeConverter<BetaReader>&, FormatB* pFormat)
{
// here you will call you ReadBeta for FromatB,
// code below is for testing
cout << "Executing Beta Reader for FormatB" <<endl;
pFormat->ExecuteBBeta();
return 4;
}
};
int main()
{
MyClass cl;
cl.TryFormats(AlphaReader());
cl.TryFormats(BetaReader());
cin.get();
}
运行此程序后,我得到以下正确输出:
Executing Alpha Reader for Base
Executing Base
Executing Alpha Reader for Base
Executing Base
Executing Beta Reader for FormatA
Executing A Beta
Executing Beta Reader for FormatB
Executing B Beta
关于c++ - 重构指向某种形式模板的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1770808/
我刚接触 C 语言几周,所以对它还很陌生。 我见过这样的事情 * (variable-name) = -* (variable-name) 在讲义中,但它到底会做什么?它会否定所指向的值吗? 最佳答案
我有一个指向内存地址的void 指针。然后,我做 int 指针 = void 指针 float 指针 = void 指针 然后,取消引用它们以获取值。 { int x = 25; vo
我正在与计算机控制的泵进行一些串行端口通信,我用来通信的 createfile 函数需要将 com 端口名称解析为 wchar_t 指针。 我也在使用 QT 创建一个表单并获取 com 端口名称作为
#include "stdio.h" #include "malloc.h" int main() { char*x=(char*)malloc(1024); *(x+2)=3; --
#include #include main() { int an_int; void *void_pointer = &an_int; double *double_ptr = void
对于每个时间步长,我都有一个二维矩阵 a[ix][iz],ix 从 0 到 nx-1 和 iz 从 0 到 nz-1。 为了组装所有时间步长的矩阵,我定义了一个长度为 nx*nz*nt 的 3D 指针
我有一个函数,它接受一个指向 char ** 的指针并用字符串填充它(我猜是一个字符串数组)。 *list_of_strings* 在函数内部分配内存。 char * *list_of_strings
我试图了解当涉及到字符和字符串时,内存分配是如何工作的。 我知道声明的数组的名称就像指向数组第一个元素的指针,但该数组将驻留在内存的堆栈中。 另一方面,当我们想要使用内存堆时,我们使用 malloc,
我有一个 C 语言的 .DLL 文件。该 DLL 中所有函数所需的主要结构具有以下形式。 typedef struct { char *snsAccessID; char *
我得到了以下数组: let arr = [ { children: [ { children: [], current: tru
#include int main(void) { int i; int *ptr = (int *) malloc(5 * sizeof(int)); for (i=0;
我正在编写一个程序,它接受一个三位数整数并将其分成两个整数。 224 将变为 220 和 4。 114 将变为 110 和 4。 基本上,您可以使用模数来完成。我写了我认为应该工作的东西,编译器一直说
好吧,我对 C++ 很陌生,我确定这个问题已经在某个地方得到了回答,而且也很简单,但我似乎找不到答案.... 我有一个自定义数组类,我将其用作练习来尝试了解其工作原理,其定义如下: 标题: class
1) this 指针与其他指针有何不同?据我了解,指针指向堆中的内存。如果有指向它们的指针,这是否意味着对象总是在堆中构造? 2)我们可以在 move 构造函数或 move 赋值中窃取this指针吗?
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: C : pointer to struct in the struct definition 在我的初学者类
我有两个指向指针的结构指针 typedef struct Square { ... ... }Square; Square **s1; //Representing 2D array of say,
变量在内存中是如何定位的?我有这个代码 int w=1; int x=1; int y=1; int z=1; int main(int argc, char** argv) { printf
#include #include main() { char *q[]={"black","white","red"}; printf("%s",*q+3); getch()
我在“C”类中有以下函数 class C { template void Func1(int x); template void Func2(int x); }; template void
我在64位linux下使用c++,编译器(g++)也是64位的。当我打印某个变量的地址时,例如一个整数,它应该打印一个 64 位整数,但实际上它打印了一个 48 位整数。 int i; cout <<
我是一名优秀的程序员,十分优秀!