में पैरामीट्रिक ग्राफ़ प्रकार बनाना, मैं ग्राफ़ का प्रतिनिधित्व करने के लिए एक सामान्य प्रकार पदानुक्रम बनाना चाहता हूं। विशेष रूप से, मैं कक्षाएं ग्राफ और नोड रखना चाहता हूं, और मैं चाहता हूं कि प्रत्येक ग्राफ प्रकार के लिए, एक संबंधित नोड प्रकार है और यदि मैं ग्राफ़ों को हेरफेर करने के लिए एक सामान्य फ़ंक्शन बनाता हूं, तो मैं चाहता हूं कि यह फ़ंक्शन वास्तविक नोड का उपयोग करे प्रकार। एक उदाहरण है कि मैंस्कैला
trait GNode[Graph]
{
... functions to get edges from this vertex, etc. ...
}
trait Graph
{
type Node <: GNode[Graph]
}
def dfs[G <: Graph](g : G, nodeAction : G#Node => Unit) = ... code ...
कोशिश की, लेकिन यह काम नहीं किया, क्योंकि जब मैंने
class ConcreteGraph extends Graph
{
class Node extends GNode[ConcreteGraph] { ... }
}
DFS समारोह किया nodeAction
के रूप में प्रकार ConcreteGraph#Node=>Unit
के एक समारोह को स्वीकार नहीं करेंगे, लेकिन केवल AnyRef=>Unit
या GNode[ConcreteGraph]=>Unit
।
साफ होने के लिए, अगर मैं सी ++ में यह किया है, मैं एक विस्तृत ग्राफ संरचना के
template <class T> struct graph_traits;
template <> struct graph_traits<concrete_graph>
{ typedef concrete_graph::node node_type; }
template <class G>
void dfs(const G& g, boost::function<void(
const graph_traits<G>::node_type&)> action) { ... }
धन्यवाद। हालांकि, मुझे यकीन नहीं है कि मुझे क्लास CGNode क्यों करना होगा और कंक्रीटग्राफ में नोड टाइप करना होगा। मैंने एक छोटा सा उदाहरण बनाया: http://snipt.org/vpk और यह मेरे लिए कार्यात्मक लगता है – jpalecek
और दूसरा एक: इस उदाहरण में, क्या मैं उन प्रकारों को डीएफ को प्रतिबंधित कर सकता हूं, जिनके नोड प्रकार <: आदेश दिया गया है या कुछ? – jpalecek