gpt4 book ai didi

c++ - 使用 std::enable_if 时的对象切片

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

我正在尝试使用 std::enable_if 来专门化一个类,如果它的一个子类定义了特定的成员函数。否则,它应该使用在基类中定义的默认实现。

#include <boost/mpl/list.hpp>
#include <boost/function_types/function_type.hpp>
#include <boost/tti/has_member_function.hpp>

#include <iostream>
#include <type_traits>
#include <memory>

BOOST_TTI_HAS_MEMBER_FUNCTION(f2)

class Base
{
public:
virtual double f1(double x, double y) const
{
std::cout << "Called Base Method" << std::endl;
return 0.0;
}
};

template<typename Derived>
class A : public Base
{
public:
template<typename T = Derived>
typename std::enable_if
< has_member_function_f2< T
, double
, boost::mpl::list<double>
, boost::function_types::const_qualified
>::value
, double
>::type
f1(double x, double y) const
{
std::cout << "Called Derived Method" << std::endl;
return static_cast<const Derived* const>(this)->f2(x);
}
};


class B : public A<B>
{
public:
double f2(double x) const
{
return 1.0;
}
};

int main()
{
std::unique_ptr<Base> base_instance( new B );
std::cout << base_instance->f1(100.0, 10.0) << std::endl;

B b_instance;
std::cout << b_instance.f1(100.0, 10.0) << std::endl;

return 0;
}

我本以为这会打印出来

Called Derived Method
1
Called Derived Method
1

但是我得到了

Called Base Method
0
Called Derived Method
1

所以看起来有些对象切片正在发生。我无法终生明白为什么会这样,如果有人能帮助我,我将不胜感激。

如果它有任何帮助,这是用 g++ 4.7.2 编译的

最佳答案

模板函数不能是虚函数。这也意味着模板函数永远不会覆盖基类中的虚函数,即使它的特定实例化签名恰好匹配。

要实现你想要的,你需要将 A 作为一个整体进行专门化,以提供一个版本而不是另一个版本的成员。

关于c++ - 使用 std::enable_if 时的对象切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27489195/

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