Ich habe zwei Codeauszüge der Vorlage Spezialisierung verwendet, die ich gefunden hatte, dass ich besonders seltsam finde. Ich würde sie sogar unnötig auffällig nennen.C++ Vorlage überbeansprucht
Im Allgemeinen habe ich meine Zweifel, dass Vorlagen tatsächlich die beste Möglichkeit sind, diese Objekte (vor allem den ersten Fall) zu entwerfen.
Welches wäre der bessere Ansatz und warum? Oder gibt es einen ganz anderen Ansatz, der besser ist?
1) Vorlagen als Ersatz des Führens Zeiger auf Funktionen:
//fusion_manager.h
template <typename InputFilterAlgorithm,
typename PredictionAlgorithm,
typename AssociationAlgorithm,
typename FusionAlgorithm>
class FusionManager
{
public:
FusionManager(Environment& env);
...
private:
Environment& env_m;
InputFilterAlgorithm filter_alg_m;
PredictionAlgorithm prediction_alg_m;
AssociationAlgorithm association_alg_m;
FusionAlgorithm fusion_alg_m;
...
};
//fusion_manager.cpp
template <typename InputFilterAlgorithm,
typename PredictionAlgorithm,
typename AssociationAlgorithm,
typename FusionAlgorithm>
FusionManager<InputFilterAlgorithm,
PredictionAlgorithm,
AssociationAlgorithm,
FusionAlgorithm,
TrackExtendedDataType>::FusionManager(Environment& env)
:
env_m(env),
filter_alg_m(env),
prediction_alg_m(env),
association_alg_m(env),
fusion_alg_m(env)
{
...
}
//main.cpp
...
FusionManager<TestInputFilterAlgorithm,
TestPredictionAlgorithm,
TestAssociationAlgorithm,
TestFusionAlgorithm> fusionManager(env);
...
... Statt so etwas wie dieses zu verwenden:
//fusion_manager.h
class FusionManager
{
public:
//Let's say each algorithm is encapsulated by a class
FusionManager(Environment& env,
InputFilterAlgorithm&&,
PredictionAlgorithm&&,
AssociationAlgorithm&&,
FusionAlgorithm&&);
private:
Environment& env_m;
InputFilterAlgorithm filter_alg_m;
PredictionAlgorithm prediction_alg_m;
AssociationAlgorithm association_alg_m;
FusionAlgorithm fusion_alg_m;
};
//fusion_manager.cpp
FusionManager::FusionManager(Environment& env,
InputFilterAlgorithm&& filter_alg,
PredictionAlgorithm&& prediction_alg,
AssociationAlgorithm&& association_alg,
FusionAlgorithm&& fusion_alg)
:
env_m(env),
filter_alg_m(std::move(filter_alg)),
prediction_alg_m(std::move(prediction_alg)),
association_alg_m(std::move(association_alg)),
fusion_alg_m(std::move(fusion_alg))
{
...
}
//main.cpp
...
FusionManager<TestInputFilterAlgorithm,
TestPredictionAlgorithm,
TestAssociationAlgorithm,
TestFusionAlgorithm> fusionManager(env);
...
2) Die Verwendung von Vorlagen als Ersatz Vererbungs- und virtuelle Methoden:
//factorization.h
template<typename ProbabilityDistributionType>
class Factorization
{
...
public:
ProbabilityDistributionType factorize();
private:
std::Vector<ProbabilityDistributionType> factors_m;
...
};
//factorization.cpp
template<>
CPD Factorization<CPD>::factorize()
{
for (auto & factor : factors_m)
{
factor.factorize();//This will call the factorize method of CPD
}
}
template<>
JointProbDistr Factorization<JointProbDistr>::factorize()
{
for (auto & factor : factors_m)
{
factor.factorize();//This will call the factorize method of JointProbDistr
}
}
Statt so etwas wie diese zu verwenden:
//factorization.h
template<typename ProbabilityDistributionType>
class Factorization
{
...
public:
virtual ProbabilityDistributionType factorize() = 0;
private:
std::Vector<ProbabilityDistributionType> factors_m;
...
};
//cpd_factorization.h
class CPDFactorization : public Factorization<CPD>
{
...
public:
CPD factorize();//Implementing the parent's pure virtual method. This will call the factorize method of CPD
};
//jointprobdistr_factorization.h
class CPDFactorization : public Factorization<JointProbDistr>
{
...
public:
JointProbDistr factorize();//Implementing the parent's pure virtual method. This will call the factorize method of JointProbDistr
};
müssen Sie berücksichtigen, dass nicht immer Vorlagen und Vererbung mit virtuellen Methoden Alternativen sind, weil man zur Kompilierzeit und die andere zur Laufzeit passiert – user463035818
Für Ihren ersten Punkt meinst du statt Zeiger auf eine Schnittstelle? – SirGuy
@ tobi303 Danke, ich bin mir bewusst, dass sie nicht immer austauschbar sind, aber ich bin auf viele Fälle gestoßen, wo sie sind. – alex