gpt4 book ai didi

c++ - 接受类型对象和所有派生类型对象的模板函数

转载 作者:行者123 更新时间:2023-11-28 02:13:16 25 4
gpt4 key购买 nike

我想要一个模板函数,它从 Base 获取作为 Base 实例或任何派生类(这里只有一个派生类)的所有对象。我的以下示例不起作用,请参阅评论以了解结果和我想要实现的目标:

#include <iostream>

template <typename T>
class Base { };

template< typename T>
class Derived: public Base<T> { };

//FIRST
template < typename T>
void Do( const T& )
{
std::cout << "FIRST " << __PRETTY_FUNCTION__ << std::endl;
}

// SECOND Should eat all types which derives from Base<T>
template < typename T>
void Do( Base<T>& base)
{
std::cout << "SECOND " << __PRETTY_FUNCTION__ << std::endl;
}


int main()
{
Derived<int> derived;
Base<int> base;

Do(base); // SECOND void Do(Base<T>&) [with T = int] OK
Do(derived); // FIRST void Do(const T&) [with T = Derived<int>] Fail -> should go to SECOND!
Do(1); // FIRST void Do(const T&) [with T = int] OK
}

原始代码将 Base 作为模板类。我简化了这一点,但应该记住。

虽然我想通过 enable_if 为基类型和派生类型禁用 FIRST 函数,但我找不到正确技巧的想法。并且只为基类和派生类启用 SECOND 也是一个选项,但我无法在这里找到诀窍。

我看到了enable_if type is not of a certain template class但这对派生的没有帮助。

编辑:抱歉,我给出的例子过于简单了。如标题中所述,我需要一些模板内容来确定模板函数的类型是模板的实例还是派生自该模板类型。我修改了示例代码。

最佳答案

编写特征来检查派生自 Base 的任何特化的类:

namespace detail {
template<class T>
std::true_type test(Base<T>*);
std::false_type test(...);
}

template<class T>
struct is_derived_from_Base : decltype(detail::test((T*)nullptr)) {};

并用它来约束第一个函数模板:

template < typename T, typename = std::enable_if_t<!is_derived_from_Base<T>{}> >
void Do( const T& )
{
std::cout << "FIRST " << __PRETTY_FUNCTION__ << std::endl;
}

关于c++ - 接受类型对象和所有派生类型对象的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34935042/

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