gpt4 book ai didi

c++ - C++ 中是否可以重载模板类?

转载 作者:行者123 更新时间:2023-12-02 01:24:08 25 4
gpt4 key购买 nike

我目前正在为我的项目创建一些实用程序,并且我想到了复制 C# Action 的想法。 C++ 中的类。正如您在 C# documentation 中看到的那样,Action类可以与模板有不同的“重载”。它有Action , Action<T1> , Action<T1, T2\>

是否可以在 C++ 中重载这样的类?或者有什么解决办法吗?

这是“伪代码”的示例,C++ 会抛出语法错误:

class Action
{
// Code
};

template<class T1>
class Action
{
// Code
};

template<class T1, class T2>
class Action
{
// Code
};

// etc...

这样您就可以根据是否输入模板来调用不同类型的类,如下所示:

int main()
{
Action a1;
Action<int> a2;
Action<int, float> a3;
// etc...

return 0;
}

我尝试了各种方法,例如:

template<T1, T2>
class Action {};

template<T1, T2>
class Action<T1.> {};

template<T1, T2>
class Action<T1, T2> {};

但这不起作用。

最佳答案

不,类不能重载。作用域中的 Action 可以是单个非模板化类,也可以是具有给定模板头(不是不同的模板头)的单个类模板。

但是,给定的类模板可以专门用于某些模板参数,并且有 variadic templates从 C++11 开始,它接受任意数量的模板参数:

template<typename... Ts>
class Action { /* generic case */ };

这允许 a2a3 以及通过 explicitpartial specialization它们可以专门用于例如一两个模板参数:

template<typename T1>
class Action<T1> { /* one template argument */ };

template<typename T1, typename T2>
class Action<T1, T2> { /* two template arguments */ };

a1 也可以从 C++17 起通过 class template argument deduction (CTAD) 工作取决于主类模板具有哪些构造函数和/或声明了哪些推导指南。


我对 C# 或上下文的了解不够,无法知道这是否是解决您的根本问题的有用方法。


此外,作为旁注:在模板头中引入模板参数时,classtypename 是同义词。如果您愿意,请选择class。没有什么区别。

关于c++ - C++ 中是否可以重载模板类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75240742/

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