Sử dụng Mẫu hiện tại làm Thông số mẫu cho một trong các Thông số mẫu


8

Tôi đang cố gắng tạo ra một cấu trúc đồ thị chung, nhưng tôi đang chạy vào sự phụ thuộc vòng tròn này giữa các đỉnh và các cạnh. Tôi định nghĩa các lớp Vertex và Edge của mình như vậy:

template<typename EdgeType>
struct Vertex {
    std::vector<EdgeType> successors;
};

template<typename EdgeCostType, typename VertexWrapper>
struct Edge {
    EdgeCostType cost;
    VertexWrapper source;
    VertexWrapper dest;
};

Tôi muốn khởi tạo nó bằng một cái gì đó như thế Vertex<Edge<int, std::shared_ptr<decltype(v)>>> v;, nhưng rõ ràng là tôi không thể. Tôi có thể làm gì để giải quyết sự phụ thuộc vòng tròn này?

Biên tập:

Tôi nghĩ vấn đề này giải quyết vấn đề là sử dụng mẫu hiện tại làm tham số mẫu cho một trong các tham số mẫu của mẫu hiện tại, ví dụ: làm thế nào để làm một cái gì đó như thế này:

template<typename VertexWrapper>
struct Vertex {
    std::vector<pair<int, VertexWrapper<Vertex>>> successors;
};

2
template <typename> class VertexWrapper? Ngoài ra, tại sao bạn có cả thẻ C ++ 11 và C ++ 17? Tiêu chuẩn nào bạn đang nhắm mục tiêu?
HolyBlackCat

@HolyBlackCat Afaik đều áp dụng, tôi chỉ nên sử dụng cái gần đây nhất? Ngoài ra tôi không chắc ý của bạn là gìtemplate <typename> typename VertexWrapper
Simon Berens

VertexWrapperđối số kiểu luôn được cho là có dạng std::shared_ptr<decltype(v)>hay some_template_here<decltype(v)>không?
quả óc chó

@walnut nó phải là một cái gì đó giống như shared_ptr / unique_ptr / cái gì đó với toán tử->
Simon Berens

Nếu tôi đang đọc đúng câu hỏi này, bạn có thể muốn xem xét các tham số "mẫu khuôn mẫu" stackoverflow.com/questions/213761/ mẹo
Joe

Câu trả lời:


10

Với tham số mẫu mẫu, bạn có thể làm một cái gì đó như:

template<typename EdgeType>
struct Vertex {
    std::vector<EdgeType> successors;
};

template<typename EdgeCostType, template <typename> class VertexWrapper>
struct Edge {
    EdgeCostType cost;
    VertexWrapper<Edge> source;
    VertexWrapper<Edge> dest;
};


using myEdge = Edge<double, Vertex>;
using myVertex = Vertex<myEdge>;

Cảm ơn! TIL về các tham số mẫu mẫu
Simon Berens

2

của bạn chỉ đơn giản là hoạt động .. (nhưng tôi không biết cách in và khởi tạo vector thành viên)

#include <vector>
#include <iostream>  
using namespace std;

template<typename EdgeType>
struct Vertex {
    vector<EdgeType> successors;
};

template<typename EdgeCostType, typename VertexWrapper>
struct Edge {
    EdgeCostType cost;
    VertexWrapper source;
    VertexWrapper dest;
};

int main (){

    Vertex<int> vertx = {{5}};
    Edge<int, decltype(vertx)> ed = {7};

    cout<< ed.cost <<"\n";     //cout<< ed.dest.successors<<"\n";   // not work, ask help!
}

1
Ý tưởng là có một Vertex<Edge<double, Vertex</*..*/>>>...
Jarod42

0

Câu trả lời của Jarod42 sẽ hoạt động, nhưng nó buộc bạn chỉ tăng gấp đôi. intVí dụ, nếu bạn muốn một cái linh hoạt hơn chấp nhận s, bạn cũng có tùy chọn này:

template<class T>
using myEdge = Edge<T, Vertex>;

template<class T>
using myVertex = Vertex<myEdge<T>>;

Điều này sẽ cho phép bạn sử dụng các loại số khác, nếu vì lý do nào đó bạn cần một tốc ký cho điều đó. Sau đó, sử dụng đôi sẽ trông như thế này:

myVertex<double> v;

1
Đó chỉ là một ví dụ sử dụng. Để đi xa hơn, tôi sẽ làmtemplate <typename T> struct graph_type { using egde = Edge<T, Vertex>; using vertex = Vertex<edge>; };
Jarod42
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.