gpt4 book ai didi

C++ 函数模板问题

转载 作者:太空狗 更新时间:2023-10-29 19:37:49 25 4
gpt4 key购买 nike

我使用 C# 已经很长时间了,我有几个关于 C++ 中的函数模板的问题。

template <typename T>
T max(T x, T y)
{
return (x > y) ? x : y;
}
  1. 为什么有些示例在模板参数声明中使用 typename 而其他示例使用 class?有什么区别?
  2. 有什么方法可以将 T 限制为特定类型,或者限制为从特定类型派生的类型?
  3. 有没有办法让一个类有两个同名的方法,只是一个是模板化的而另一个不是?

更新:

我感谢所有的答案,但其中一些包含示例,当我尝试将它们应用到我的代码时我不会编译这些示例。

为了弄清楚问题3,我有以下方法:

template<typename T>
std::unique_ptr<T> ExecuteSqlQuery(LPCTSTR pszSqlQuery, UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE);

我想声明一个使用 CRecordset 作为 T 的变体,这样下面的任何一个语句都是有效的:

auto result = db.ExecuteSqlQuery<CCustomerRecordset>(L"SELECT ...");

auto result = db.ExecuteSqlQuery(L"SELECT ...");

最佳答案

Why do some examples use typename and other examples use class in the template parameter declaration? What is the difference?

两者在模板参数声明中没有区别,但是它们在其他上下文中都有额外的不同含义。例如。 typename用于将依赖名称标记为类型名称,class用于引入类声明。

Is there any way to restrict T to a particular type, or a type that derives from a particular type?

是的,一种方法是依靠 SFINAE 丢弃满足某些条件的类型的实例化,通常由 std::enable_if 促进,例如(使用 C++14):

template<typename T, typename = std::enable_if_t<std::is_base_of_v<SomeBaseClass, T>>
T max(T x, T y)
{
return (x > y) ? x : y;
}

在即将到来的C++20中,将支持Concepts,允许编写

template<std::DerivedFrom<SomeBaseClass> T>
T max(T x, T y)
{
return (x > y) ? x : y;
}

Is there any way for a class to have two methods with the same name, except one is templated and the other is not?

是的,这是可能的。在重载决议中,如果两个候选者匹配得同样好,则优先选择非模板化的候选者。

关于C++ 函数模板问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57619611/

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