在 C++ 中的多个类中使用模板类
Posted
技术标签:
【中文标题】在 C++ 中的多个类中使用模板类【英文标题】:Using a template class in multiple classes in C++ 【发布时间】:2020-04-14 10:42:58 【问题描述】:假设我有 3 个类如图所示
我想创建一个模板函数,而不是对象类中的函数,它可以代替对象类中的两个函数。我遇到的问题是我不知道如何允许模板函数接受类型修饰符_1 或类型修饰符_2 的参数。有没有办法做到这一点?
谢谢。
【问题讨论】:
请不要将代码包含为图像。将代码包含为文本。最好尝试一些东西并展示你的尝试。目前尚不清楚为什么您在编写接受两者之一的方法模板时遇到问题。如果您的问题是该方法不仅接受这两个,而且还接受其他任何内容,我可以理解,但目前尚不清楚是什么问题 顺便说一句,您的两种方法都不使用mod_1
/ mod_2
,它们只是添加了两个int
s,您可以删除未使用的参数并且您的“问题”消失了
@idclev463035818 ...除非这是一个简化和提炼的示例,而在实际代码中实际使用了参数。
@lisyarus 在这种情况下,它被提炼到本质已经消失并且像 mcve 一样无用的范围内。在发布的代码中,无法知道为什么删除未使用的参数不是解决方案
【参考方案1】:
我能想到 3 种解决方案,可能会满足您的需求。
1.
class object : public modifier_1, public modifier_2
private:
int x;
template<class Modifier>
void modify_by_modifier_helper(Modifier mod, int modifier)
x += modifier;
public:
object() = default;
void modify_by_modifier(modifier_1 mod, int modifier)
modify_by_modifier_helper(mod, modifier);
void modify_by_modifier(modifier_2 mod, int modifier)
modify_by_modifier_helper(mod, modifier);
;
2.
#include <type_traits>
class object : public modifier_1, public modifier_2
private:
int x;
public:
object() = default;
template<class Modifier>
void modify_by_modifier(Modifier mod, int modifier)
static_assert(std::is_same_v<std::decay_t<Modifier>, modifier_1> ||
std::is_same_v<std::decay_t<Modifier>, modifier_2>,
"Modifier must be modifier_1 or modifier_2")
x += modifier;
;
3.
#include <type_traits>
class object : public modifier_1, public modifier_2
private:
int x;
public:
object() = default;
template<class Modifier>
std::enable_if_t<std::is_same_v<std::decay_t<Modifier>, modifier_1> ||
std::is_same_v<std::decay_t<Modifier>, modifier_2>, void>
modify_by_modifier(Modifier mod, int modifier)
x += modifier;
;
【讨论】:
第一个解决方案是否使对象类抽象?我现在无法实例化它。 @CosmicCoder123 不,它不应该使它抽象。我用 g++ 和 clang++ 对其进行了测试,并且我希望能够实例化它。 @Issac Clancy 我认为该方法是我想要的,但由于某种原因,它使我的对象类在 Visual Studio 2019 中进行抽象编译。所以我无法实例化对象。 @CosmicCoder123 我在 Visual Studio 2019 中对其进行了测试,它工作正常。尝试将object() = default;
更改为 object()
并查看 Visual Studio 给出的错误。
@CosmicCoder123 如果你正在像这样实例化你的对象object o();
尝试像这样实例化你的对象object o;
以上是关于在 C++ 中的多个类中使用模板类的主要内容,如果未能解决你的问题,请参考以下文章