Это похоже на работу для паттерна стратегии .Это может быть реализовано в этом случае в качестве параметра шаблона.Часто это будет реализовано как параметр конструктора или метод установки в классе, но для правильной работы потребуется наследование.
В этом случае что-то вроде:
template <class SpecificStrategy>
class A {
private:
double data;
public:
double calc(){
return data*data;
}
double especific() {
return SpecificStrategy::especific(data);
}
};
class DoubleStrategy {
static double especific(double data) {
return 2 * data;
}
};
class TripleStrategy {
static double especific(double data) {
return 3 * data;
}
};
Тогда выможно сослаться на:
A<DoubleStrategy> x;
A<TripleStrategy> y;
x
и y
будут совершенно не связанных типов, но, похоже, в данном случае это не то, что вы хотите.Мнение с использованием виртуальной функции и наследования - путь.Как кто-то еще отметил, снижение производительности не так велико.Однако есть обстоятельства, при которых я вижу, что это будет плохой идеей.
Например, если этот класс предназначен для представления вектора в графическом пакете, и вы собираетесь выполнять то же преобразованиедля миллионов из них я мог видеть, как вы не хотели бы, чтобы вызов виртуальной функции был частью кода, который выполнял преобразование.На самом деле, вы бы хотели избежать разыменования указателей любого типа, который мог бы вам помочь.