gpt4 book ai didi

c++ - 二元运算的类型删除

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

可以编写一个包装器,它采用任何支持特定操作的类型,例如

#include <iostream>

class Houdini
{
struct I_Houdini_Impl
{
virtual void foo_impl(int x) const = 0;

virtual ~I_Houdini_Impl() { }
};

template <typename T>
struct Houdini_Impl : I_Houdini_Impl
{
Houdini_Impl(T const & t) : m_t(t) { }

void foo_impl(int x) const { m_t.foo(x); }

T m_t;
};
public:
template <typename T>
Houdini(T const & t) : m_impl(new Houdini_Impl<T>(t)) { }

void foo(int x) const { m_impl->foo_impl(x); }
protected:
private:

std::unique_ptr<I_Houdini_Impl> m_impl;
};

class A
{
public:
void foo(int x) const { std::cout << "A::foo(" << x << ")" << std::endl; }
};

class B
{
public:
template <typename T>
char foo(T const & t) const { std::cout << "B::foo(" << t << ")" << std::endl; return 'B';}
};

void houdini()
{
A a;
B b;
Houdini ha(a);
Houdini hb(b);

ha.foo(7);
hb.foo(8);
}

我可以在 Houdini 类中包装任何支持可以用 int 调用的常量方法 foo 的东西,无论它是普通成员函数(如 A 类中)还是函数模板(如 B 类中) )(并且让我们暂时忽略 Houdini 应该展示值(value)语义学)。到目前为止一切顺利,但我想做的是编写一个支持二进制操作的包装器,例如编写一个接受任何类型的包装器,例如,您可以添加任意两个包装器,只要可以添加包装的对象并从添加中返回包装的返回对象:

class A { };
class B { };
class C { };

C operator+(A, B) { return C(); }

class Randi
{
public:
template <typename T> Randi(T ) { }

/* magic stuff goes here */
};

void randi()
{
A a;
B b;

Randi ra(a);
Randi rb(b);

Randi rc = ra + rb;
// rc is a Randi-object that wraps an object of type C
}

如果我事先知道我要存储什么类型,我可以通过写访问者来实现,但这正是我不想想做的。我需要打开两个对象,尝试在两个打开的对象上调用 operator+ 并再次包装结果,但我不知道该怎么做。

最佳答案

考虑以下

class Number
{
virtual Number* sum(Number* other) = 0;
};

class Int
: public Number
{
virtual Number* sum(Number* other)
{
// hard to implement since we doesn't know the type of other
}
};


class Double
: public Number

{
virtual Number* sum(Number* other)
{
// hard to implement since we doesn't know the type of other
}
};

我们可以在 sum 实现中执行 dynamic_casts 来分别处理每种情况,或者我们可以使用双重调度。

class Double;
class Int;

class Number
{
public:
virtual Number* sum(Number* other) = 0;
protected
virtual Number* sum(Int* other) = 0;
virtual Number* sum(Double* other) = 0;
};

class Int
: public Number
{
virtual Number* sum(Number* other)
{
return other->sum(this);
}

virtual Number* sum(Int* other)
{
// implement int + int
}

virtual Number* sum(Double* other)
{
// implement int + double
}
};


class Double
: public Number

{
virtual Number* sum(Number* other)
{
return other->sum(this);
}


virtual Number* sum(Int* other)
{
// implement double + int
}

virtual Number* sum(Double* other)
{
// implement double + double
}
};

在机器人案例中,实现应该了解所有派生类。这意味着 Randi 类的 Houdini_Impl 模拟应该知道可能传递给 Randi 的构造函数的所有其他类型,这是不可能的。

关于c++ - 二元运算的类型删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15387511/

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