gpt4 book ai didi

c++ - 如何让 MyClass 的用户通过编译器标志控制类的哪个版本被实例化?

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

我有一个在时间敏感代码中运行的 C++ 类,因此仅仅构造对象可能会花费比用户花费更多的时间。我想定义我的类的标准版本和可简单构造的版本,并让类的用户控制类的哪个版本通过编译器标志实例化。我希望编译器标志在 group 级别工作。例如,如果标志是 LEVEL=:OFF,GROUP1:ON,则将为该类的所有实例构造普通版本,GROUP1 中的实例除外,这将获得实际的、非平凡的实例化。目标是让用户能够在编译时通过更改标志值来关闭某些组。

我想使用 C++11 的 std::conditional 来控制使用哪个版本的类。为此,我需要检查与该类的给定用法相关联的组,并将其与该组的编译器标志设置进行比较。我想不出一种方法让类的用户将编译时设置从用户的源文件传递给主类定义。我可以要求用户在他们的源文件中放置类似 #define MYCLASS_GROUP ON 的内容,但我认为我不能在定义我的类的文件中引用它。

有没有办法让类的用户从用户的源文件中控制类的编译版本?在此先感谢您的任何想法!

更新:以下是我理想中的使用方式。用户可以这样做:

#define MYCLASS_GROUP GROUP1

MyClass myClassInstance;

然后,他们可以通过编译器标志控制实例化哪个版本。因此 -DMYCLASS_GROUP_LEVEL=:OFF,GROUP1:ON 将在 GROUP1 中启用上述用例。

在类定义中,我想要类似以下无效伪代码的内容:

class MyClassOn {
non-trivial code here
};
class MyClassOff {
};
typedef std::conditional<check-group-here, MyClassOn, MyClassOff>::type MyClass;

最佳答案

您可以使用模板特化。

首先声明选项:

class DefaultVersion;
class TriviallyConstructible;

接下来创建类的主要模板定义

template <typename T = DefaultVersion>
class MyClass;

DefaultVersion 的特化:

template< >
class MyClass< DefaultVersion >
{
// ...
};

专门用于可简单构造的版本

template<>
class MyClass< TriviallyConstructible >
{
// ...
};

使用示例

MyClass<> m1;
MyClass< DefaultVersion > m2; // same as m1
MyClass< TriviallyConstructible > m3;

如果用户愿意,他们可以为这种类型声明一个别名,可以在应用程序中使用。


如何将编译时标志传递给类?

通过预处理器指令和别名。

#ifdef GROUP1 > 0
using MyClassGroup1 = MyClass< TriviallyConstructible >;
#else
using MyClassGroup1 = MyClass< DefaultVersion >;
#endif

或者另一种方式:

#ifdef GROUP1 > 0
using Group1 = TriviallyConstructible;
#else
using Group1 = DefaultVersion;
#endif

在使用地点

MyClass< Group1 > m4;

关于c++ - 如何让 MyClass 的用户通过编译器标志控制类的哪个版本被实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50536878/

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