我正在尝试使用boost :: static_visitor在boost :: variant类型上实现影响某些变量状态的操作.我的方法是在命令访问者类中包含所有状态变量,但似乎这是不可能的.
这是我的代码示例:
#include <string>
#include <sstream>
#include <vector>
#include <boost/variant.hpp>
#include <boost/foreach.hpp>
struct TypeA
{
int varA;
int varB;
};
struct TypeB
{
std::string varA;
std::string varB;
};
typedef boost::variant<TypeA, TypeB> MyVariantType;
class MyCommandVisitor : public boost::static_visitor<>
{
public:
//These are just examples, the actions only need to be able to touch
// internal variables.
void operator()(TypeA & t) const
{
m_runningSum += t.varA;
m_outStream << "TYPEA ACTION: " << t.varB << std::endl;
}
void operator(TypeB …Run Code Online (Sandbox Code Playgroud) 我尝试使用扩展类的访问者模式.我有动物类列表,每个动物都是不同的.当我给访问者打电话时,它只执行谈话(动物a),而不是对象的具体实例.见下文:
class Animal {}
class Cat extends Animal {}
class Dog extends Animal {}
class Poodle extends Dog {}
class Visitor {
public void talk(Animal a) { System.out.println("?"); }
public void talk(Cat a) { System.out.println("Meow"); }
public void talk(Dog a) { System.out.println("bark"); }
public void talk(Poodle a) { System.out.println("Arf"); }
}
public class Demo{
public static void main(String []args){
Visitor visitor = new Visitor();
Animal list[] = { new Cat(), new Dog(), new Poodle() };
for (Animal a : list) …Run Code Online (Sandbox Code Playgroud) 我有ObjectList容器,我想添加一个内部迭代器(访问者模式)实际上我正在尝试确定我的列表中的重复项.
样本:http://pastebin.com/pjeWq2uN
这段代码提供了我正在努力实现的目标.
TFindDuplicatesMethod = procedure(s1, s2: string) of object;
TPersonList = class(TObjectList)
public
procedure Iterate(pMethode: TFindDuplicatesMethod)
end;
procedure TPersonList.Iterate(pMethode: TFindDuplicatesMethod)
var
i: Integer;
begin
for i := 0 to Count - 1 do
pMethode(TMyClass(Items[i]).S1, {But i don't have the second parameter because
it comes from outside of PersonList Ex: OpenDialog.Files[i]})
end;
function FindDuplicate(S1, S2: string): Boolean;
begin
Result := False;
if S1 = S2 then
Result := True;
end;
begin
Files.Iterate(FindDuplicates(S1, S2));
end;
Run Code Online (Sandbox Code Playgroud)
我想知道OOP如何解决这个问题.
提前致谢...
在Java中,我能够在不指定类型的情况下定义泛型类的变量.
class Tree<T extends Comparable<? super T>> {}
somewhere-else: Tree tree;
Run Code Online (Sandbox Code Playgroud)
然后我可以从文件中读取一些对象并将其类型转换为我想要的类类型.
tree = (Tree<String>) some object;
Run Code Online (Sandbox Code Playgroud)
随着boost::variant我已经开始变体的定义.
typedef boost::variant<Tree<std::string>, Tree<int>> TreeVariant; TreeVariant tree;
Run Code Online (Sandbox Code Playgroud)
我知道我需要指定一个visitor class但是从这个例子中不清楚如何定义它,以便我能够分配给我的tree变量Tree<std::string>或者Tree<int>.
然后我想从那里继续使用变量调用Tree的成员函数tree.
我很难理解这两种设计模式。
您能否给我提供上下文信息或示例,以便我可以清楚地了解并能够映射两者之间的差异。
谢谢。
我试图在具有对象具有不同返回类型(int和void)的方法的对象结构中实现Java的Visitor模式(家庭运动,对不起)。
ConcreteVisitor(即CostAss)返回int,第二个ConcreteVisitor(即drawCosts)返回void(即成本的打印)。
我有问题要了解如何实施此问题。我不允许在Employee接口中创建两个accept方法(一个int一个void)
如果代码是用Java编写的,那么任何人都可以引导我阅读描述访问者设计模式的优秀文章.
谢谢
我经常使用一种模式来使代码更简单,我喜欢称之为Power Enum,它是一个利用访问者模式以及携带自定义数据的枚举.这是Java中的一个例子:
import java.security.SecureRandom;
import java.util.UUID;
import java.util.stream.IntStream;
public class PowerEnumDemo {
private static final SecureRandom random = new SecureRandom();
public static void main(String[] args) {
for (int i = 0; i < 3 ; i++) {
final Color selected = Color.values()[random.nextInt(3)];
System.out.println("Selected: " + selected);
System.out.println("rgb: " + selected.rgb);
selected.visit();
}
}
public enum Color {
RED("0000ff") {
@Override
public void visit() {
IntStream.range(1, 10).forEach(System.out::println);
}
},
GREEN("00ff00") {
@Override
public void visit() {
System.out.println(UUID.randomUUID().toString().chars().filter(c -> c == 'a').count()); …Run Code Online (Sandbox Code Playgroud) 我最近发现自己在我的代码中反复使用相同的模式.基本上它是访问者模式的变体,我用它来解析对派生类的基类实例的引用.这种方法需要大量的样板代码.
问题:
c# design-patterns programming-languages visitor-pattern multimethod
java ×4
c++ ×2
boost ×1
c# ×1
delphi ×1
delphi-2010 ×1
enumeration ×1
loops ×1
multimethod ×1
scala ×1
tobjectlist ×1