gpt4 book ai didi

c++ - 使用 std::enable_if 作为模板时的默认模板参数。 param.: 为什么可以使用两个仅在 enable_if 参数上不同的模板函数?

转载 作者:可可西里 更新时间:2023-11-01 15:05:18 25 4
gpt4 key购买 nike

language reference of std::enable_if at cppreference包括以下注释

Notes

A common mistake is to declare two function templates that differ only in their default template arguments. This is illegal because default template arguments are not part of function template's signature, and declaring two different function templates with the same signature is illegal.

在下面例子中的模板函数中,我觉得会出现这种情况。即,这两个模板函数 onlyForDerivedObjects(...) 似乎(对我而言)仅在它们的默认模板参数上有所不同。我意识到我在这里遗漏了一些东西,希望有人可以向我解释这一点,或者为我指明方向,让我可以为自己找到顿悟。

  • 问题:W.r.t.上面的引述,为什么下面的例子编译并运行良好:当我认为它产生两个模板的情况时,我是否错误分类了下面模板函数中的 typename std::enable_if ... 部分仅在默认模板参数方面不同的函数?

例子

基类和派生类:

class BaseA
{
public:
int getInt() const { return 21; };
};

class DerivedA : public BaseA {};

class BaseB
{
public:
int getAnotherInt() const { return 33; };
};

class DerivedB : public BaseB {};

具有以下模板函数

/* template functions that, seemingly, only differ in their
default template arguments? */
template< class T,
typename std::enable_if<std::is_base_of<BaseA, T>::value>::type* = nullptr >
int onlyForDerivedObjects(const T& obj)
{
return 2*obj.getInt();
}

template< class T,
typename std::enable_if<std::is_base_of<BaseB, T>::value>::type* = nullptr >
int onlyForDerivedObjects(const T& obj)
{
return 3*obj.getAnotherInt();
}

编译和运行良好(g++ -Wall -std=c++11 ...g++ 4.9.3)

#include <iostream>
#include <type_traits>

/* ... classes and template functions as above */

/* template argument deduction seems to work fine */
int main()
{
DerivedA* objA = new DerivedA();
DerivedB* objB = new DerivedB();

std::cout << onlyForDerivedObjects(*objA) << std::endl; // 42
std::cout << onlyForDerivedObjects(*objB) << std::endl; // 99

return 0;
}

最佳答案

Notes

A common mistake is to declare two function templates that differ only in their default template arguments. This is illegal because default template arguments are not part of function template's signature, and declaring two different function templates with the same signature is illegal.

您的函数不仅在默认模板参数方面有所不同,它们在模板参数方面也有所不同,因此具有不同的签名。

在这两种情况下,默认模板参数都是nullptr,但是第二个模板参数在每种情况下都不同。

关于c++ - 使用 std::enable_if 作为模板时的默认模板参数。 param.: 为什么可以使用两个仅在 enable_if 参数上不同的模板函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38305222/

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