gpt4 book ai didi

c++ - 混合模板函数重载和继承

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

打印以下代码:

generic
overload

但我想要的是在两种情况下都调用了重载或特化,而不是通用的。我并没有试图将重载与模板特化混合在一起,它们在这里是因为没有一个像我预期的那样工作。是否有任何模板魔术可以实现这一目标?

#include <iostream>

class Interface {};
class Impl: public Interface {};

class Bar
{
public:
template<typename T> void foo(T& t) {
std::cout << "generic\n";
}
void foo(Interface& t) {
std::cout << "overload\n";
}
};
template<> void Bar::foo<Interface>(Interface& t) {
std::cout << "specialization\n";
}

int main() {
Bar bar;
Impl impl;
Interface& interface = impl;
bar.foo(impl);
bar.foo(interface);
return 0;
}

最佳答案

使用 type_traits 测试参数是否派生自接口(interface)的两种方法。

#include <boost/type_traits.hpp>

class Interface {};
class Impl: public Interface {};

class Bar
{
template <class T> void foo_impl(T& value, boost::false_type)
{
std::cout << "generic\n";
}
void foo_impl(Interface& value, boost::true_type)
{
std::cout << "Interface\n";
}
public:
template<typename T> void foo(T& t) {
foo_impl(t, boost::is_base_of<Interface, T>());
}

};

或者如果满足条件则禁用模板,只留下非模板作为候选。

#include <boost/utility/enable_if.hpp>
#include <boost/type_traits.hpp>

class Interface {};
class Impl: public Interface {};

class Bar
{
public:
template<typename T>
typename boost::disable_if<boost::is_base_of<Interface, T>, void>::type foo(T& t)
{
std::cout << "generic\n";
}

void foo(Interface&)
{
std::cout << "Interface\n";
}
};

关于c++ - 混合模板函数重载和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4371699/

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