gpt4 book ai didi

c++ - 是否可以在编译时检查类型是否派生自模板的某些实例化?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:28 26 4
gpt4 key购买 nike

我想编写一个模板函数,如果传递的类型是从另一个类的任何模板实例派生的,则它以一种方式运行,否则以另一种方式运行。

我认为下面的代码捕捉到了我想做的事情。不幸的是,Caller 为 doubleDerived 打印“generic”。

#include <iostream>

template <typename T>
struct Base
{
};

struct Derived
:
public Base<int>
{
};

template <typename T>
void Foo(const T&)
{
std::cout << "generic" << std::endl;
}

template <typename T>
void Foo(const Base<T>&)
{
std::cout << "derives from Base<T>" << std::endl;
}

template <typename T>
void Caller(const T& t)
{
Foo(t);
}

int main()
{
double x;
Caller(x);

Derived d;
Caller(d);

return 0;
}

(请注意,调用方不知道其参数可能派生自 Base 的哪个实例化。)

最佳答案

它正在调用 const T&过载,因为它比 const base<T>& 更匹配.原因是因为调用第一个不需要转换,而第二个需要派生到基础的转换。

这是一个快速技巧,向您展示如何完成(注意引入的基类):

#include <iostream>
#include <type_traits>

struct EvenMoreBase {};

template <typename T>
struct Base : EvenMoreBase
{
};

struct Derived
:
public Base<int>
{
};

template <typename T>
typename std::enable_if<!std::is_base_of<EvenMoreBase, T>::value>::type
Foo(const T&)
{
std::cout << "generic" << std::endl;
}

template <typename T>
void Foo(const Base<T>&)
{
std::cout << "derives from Base<T>" << std::endl;
}

template <typename T>
void Caller(const T& t)
{
Foo(t);
}

int main()
{
double x;
Caller(x);

Derived d;
Caller(d);

return 0;
}

关于c++ - 是否可以在编译时检查类型是否派生自模板的某些实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19021887/

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