Если они используются только в одном файле, то нет необходимости показывать их внешнему миру, включая их в заголовочный файл.
Если они используются и всегда будут использоваться только в одном месте, то на самом деле нет никакой причины не просто записывать их как литералы, где их нужно использовать.
Если бы они использовались в нескольких местах в cpp, я бы выбрал анонимное пространство имен.
Другой вариант, который вы не упомянули, - это определить их как статические переменные внутри cpp. это несколько эквивалентно опции анонимного пространства имен и более похоже на C, чем на C ++.
Эквивалентный код Scala, как вы говорите
val g: UndirectedGraph[String, DefaultEdge] = new SimpleGraph[String, DefaultEdge](classOf[DefaultEdge])
, но он может немного стать СУХИМ, потому что Scala может определить параметры типа вашего конструктора
val g: UndirectedGraph[String, DefaultEdge] = new SimpleGraph(classOf[DefaultEdge])
Но это не так СУХО, как может получить. Тип "DefaultEdge" упоминается дважды. Вы можете получить еще больше СУХИХ с манифестами. Сначала вы создаете фабрику для создания SimpleGraphs.
object SimpleGraph {
import scala.reflect.Manifest
def apply[T, E]()(implicit mfst : Manifest[E]) = new SimpleGraph[T,E](mfst.erasure.asInstanceOf[Class[_ <: E]])
}
И с этим мы можем создать график либо с
val g = SimpleGraph[String, DefaultEdge]()
, либо с
val g: UndirectedGraph[String, DefaultEdge] = SimpleGraph()
Очевидно, что этот метод того стоит, только если вы создадите группу SimpleGraphs
Теперь некоторые предостережения и предупреждения. Манифесты до сих пор считаются экспериментальными. Я подозреваю, что они слишком полезны, чтобы когда-либо отказываться от них, но нет никаких гарантий. Подробнее о манифестах см. http://scala-blogs.org/2008/10/manifests-reified-types.html
Я нашел свой собственный ответ. Эквивалент:
val g = new SimpleGraph[String, DefaultEdge](classOf[DefaultEdge])