그래서 ... 어떤 스크립트를 작성하기위한 표준 라이브러리가 있습니까/xmls 독자는 스크립트를 어떤 롤을 통해 객체에 맵핑합니까?부스트 C++로 스크립트 인터프리터를 생성하는 방법
답변
클래스를 특정 순서로 시작하려면 스크립트 언어가 과도하게 사용되는 것으로 생각합니다. 당신이 필요로하는 것은 지형 학적 정렬입니다.
당신은
향상이 필요한 무엇 topographical sort 있습니다. 부스트 라이브러리가 당신에게 조금이라면 C++로 옮겨 가야하는 매우 읽기 쉬운 C# 구현을 읽을 수도 있습니다. 그건 here입니다.
는 기본적으로
을 무엇을, 당신은 당신의 클래스로 정렬 알고리즘을 제공하고 당신은 자신의 의존성을 (정렬 알고리즘은 정점 가장자리로 이러한 전망)를 추가합니다. 완료되면 알고리즘을 적용합니다. 당신이 나가는 것은 어떤 물건이 무엇에 의존하는지입니다.
로드 할 필요가있는 서브 시스템이있을 때이 정확한 방법을 사용했습니다. 일부는 다른 시스템에 의존하고 일부는로드하지 않았습니다. 서브 시스템의 양은 임의이며, 프로그램의 플러그인 특성으로 인해 컴파일 타임에는 알려지지 않았습니다.
필자는 각 서브 시스템에 고유 한 식별자 (부수적으로 boost::uuid
을 사용)를 할당했으며, 각 서브 시스템은이 서브 시스템에 의존하는 다른 서브 시스템의 식별자를 나열했습니다. 이것은 분류기에 공급되었고 초기화 순서가 백 엔드에서 나왔습니다.
당신을 도울 수 있도록 몇 가지 코드가 있습니다 (참고 :이 시점에서 나는 부스트 라이브러리가 존재한다는 것을 몰랐습니다. 이것은 위에 제공된 링크의 C# 코드를 기반으로 한 내 구현입니다)
// class TopologicalSorter
template<typename TYPE> class TopologicalSorter
{
private:
std::vector<TYPE> m_Vertices;
std::vector<std::vector<TYPE> > m_Matrix;
std::vector<TYPE> m_Sorted;
TYPE m_nNumVerts;
TYPE m_nSize;
// private helpers
int noSuccessors()
{
bool isEdge;
for(TYPE row(0); row < m_nNumVerts; row++)
{
isEdge = false;
for(TYPE col(0); col < m_nNumVerts; col++)
{
if(m_Matrix[row][col] > 0) // edge to another?
{
isEdge = true;
break;
};
};
if(!isEdge)
return(row);
};
return(-1); // nope!
}; // eo noSuccessors
void deleteVertex(TYPE _vertex)
{
if(_vertex != m_nNumVerts - 1)
{
for(TYPE j(_vertex); j < m_nNumVerts - 1; j++)
m_Vertices[j] = m_Vertices[j + 1];
for(TYPE row(_vertex); row < m_nNumVerts - 1; row++)
moveRowUp(row, m_nNumVerts);
for(TYPE col(_vertex); col < m_nNumVerts - 1; col++)
moveColLeft(col, m_nNumVerts - 1);
};
--m_nNumVerts;
}; // eo deleteVertex
void moveRowUp(TYPE _row, TYPE _length)
{
for(TYPE col(0); col < _length; col++)
m_Matrix[_row][col] = m_Matrix[_row + 1][col];
}; // eo moveRowUp
void moveColLeft(TYPE _col, TYPE _length)
{
for(TYPE row(0); row < _length; row++)
m_Matrix[row][ _col] = m_Matrix[row][_col + 1];
}; // eo moveColLeft
public:
TopologicalSorter(TYPE _size) : m_nNumVerts(0)
, m_Vertices(_size)
, m_Matrix(_size)
, m_Sorted(_size)
, m_nSize(_size)
{
assert(_size > 0);
for(TYPE i(0); i < m_nSize; ++i)
{
for(TYPE j(0); j < m_nSize; ++j)
m_Matrix[i].push_back(0);
};
}; // eo ctor
~TopologicalSorter(){};
// public methods
TYPE addVertex(TYPE _vertex)
{
m_Vertices[m_nNumVerts++] = _vertex;
return(m_nNumVerts - 1);
}; // eo addVertex
void addEdge(TYPE _start, TYPE _end)
{
m_Matrix[_start][_end] = 1;
}; // eo addEdge
std::vector<TYPE> sort()
{
int currVertex;
while(m_nNumVerts)
{
currVertex = noSuccessors();
coreAssert(currVertex != -1, "Graph has cycles");
m_Sorted[m_nNumVerts - 1] = m_Vertices[currVertex];
deleteVertex(currVertex);
}; // eo while(m_nNumVerts)
return(std::move(m_Sorted));
}; // eo sort
}; // eo class TopologicalSorter
지금이이 도움과 해제에 필요한 스크립트를 피하기
// create a topological sorter:
utility::TopologicalSorter<ManagerVector_sz> sorter(m_Managers.size());
std::map<Uuid, ManagerVector_sz> indexes;
// add vertices and edges
for(ManagerVector_sz i(0); i < m_Managers.size(); ++i)
indexes.insert(std::pair<Uuid, ManagerVector_sz>(m_Managers[i]->getUuid(), sorter.addVertex(i)));
for(ManagerVector_sz i(0); i < m_Managers.size(); ++i)
{
if(m_Managers[i]->getDependencies().size())
{
for(ManagerVector_sz j(0); j < m_Managers[i]->getDependencies().size(); ++j)
sorter.addEdge(i, indexes[m_Managers[i]->getDependencies()[j]]);
};
};
// get the order in which we should initialise
m_SortedIndexes = sorter.sort();
// and initialise
ManagerVector* mv(&m_Managers);
std::for_each(m_SortedIndexes.rbegin(),
m_SortedIndexes.rend(),
[&mv](int i){mv->at(i)->initialise();});
희망 (UUID 그냥 boost::uuids::uuid
에 대한 typedef
이다)이이로드 및 서브 시스템을 초기화에 사용 된 방법입니다!
Boost Spirit 라이브러리를 사용하면 상당히 쉽게 구성 형식을 정의 할 수 있습니다.
- 1. 컴파일 시간에 문자열에서 부스트 uuid를 생성하는 방법
- 2. Python : 디버그 인터프리터를 감지하는 방법
- 3. 쉘 스크립트 코드를 C로 변환합니다
- 4. 서버에서 자바 스크립트 파일을 생성하는 방법
- 5. 클로저를 C로 에뮬레이트하는 방법
- 6. 길이를 C로 변환하는 방법
- 7. 이것을 C로 변환하는 방법 #
- 8. C# 인터프리터를 실행하는 가장 좋은 방법
- 9. 새 데이터베이스를 생성하는 SQL 스크립트
- 10. Rails 3 모델을 생성하는 스크립트
- 11. dll에서 C로 구조체를 변환하는 방법 #
- 12. C++ 코드를 C로 변환하는 방법
- 13. BMP를 AVI C로 변환하는 방법 #
- 14. C로 PHP 모듈을 작성하는 방법
- 15. PyDev 내에서 Python 커맨드 라인 인터프리터를 실행
- 16. 은 Tcl의 쉘 임 내 펄 스크립트 내에서 내 티클 인터프리터를 인스턴스화하는 방법
- 17. 부스트 스레드 라이브러리를 컴파일하는 방법
- 18. 부스트 : 부스트를 MacOSX에서 빌드하는 방법
- 19. 부스트 : 메서드 내에서 deserialize하는 방법?
- 20. 부스트 스레드 - 인터럽트를 확인하는 방법
- 21. PHP에서 Objective-C로
- 22. c로 typecasting
- 23. C로 오버로딩 되었습니까?
- 24. 부스트 : 부스트 용 MacOSX 바이너리
- 25. 델파이에서 tinyurl을 생성하는 방법
- 26. SQL 쿼리를 생성하는 방법
- 27. 오라클에 유형을 생성하는 방법
- 28. 엔티티에서 테이블을 생성하는 방법
- 29. 데이터베이스에서 XML을 생성하는 방법
- 30. 동적으로 컨트롤을 생성하는 방법
내 주요 요점 - 다른 순서로 시작한 수업이 많아서 다른 결과가 나옵니다. 원하는 순서대로 tham을 시작하게하려면 뭔가가 필요합니다. 응용 프로그램이 컴파일 된 후. – Rella
내가 원하는 것을 모르겠지만 어쩌면 이것이 무엇을 찾고 있는지 알 수 있습니다. http://www.boost.org/doc/libs/1_45_0/doc/html/property_tree.html – MatiasFG
질문이 조금 혼란스러워 보입니다. 나는 네가 여기서 원하는 것을 전혀 확신하지 못한다. 좀 더 구체적인 예를 들어 주시겠습니까? 그런데 질문 아래에있는 '수정'링크를 클릭하면 자세한 내용을 추가 할 수 있습니다. 코멘트가 너무 많으면 코멘트가 숨겨집니다. – bdonlan