Я работаю над кодом и решил добавить поддержку скалярных типов, чтобы иметь возможность переключаться между std::complex<double>
и простым double
. У меня есть все количество хрустов, написанных, и я использовал его с помощью метода template <typename Scalar>
.Предоставить/включить метод для класса в зависимости от типа шаблона
Моя «проблема» заключается в том, что для сложного случая мне нужно будет предоставить некоторые дополнительные методы, которые в реальном случае не имеют смысла и не могут быть закодированы.
Мой предыдущий подход заключался в создании шаблона базового класса, который реализовал все общее. Тогда у меня есть конкретный класс, который вытекает из этого базового класса, с аргументом шаблона Scalar
std::complex<double>
. Затем у меня есть тип шаблона прокси/фиктивный класс, который ведет себя как переключатель между версией double
и std::complex<double>
. Он выглядит более или менее похожим ниже.
//base stuff
template<typename Scalar>
class NumberCruncherBase{
Scalar stuff1();
Scalar stuff2();
Scalar stuff3();
}
//inherit base stuff and extend it
class NumberCruncherComplex : public NumberCruncherBase< std::complex<double> >{
std::complex<double> extra_stuff1();
}
//switch proxy
template<typename Scalar>
class NumberCruncher : public NumberCruncherBase<Scalar> {}
//specialization for complex to explicitly derive from the extension
//in case of complex
template<>
class NumberCruncher< std::complex<double> > : public NumberCruncherBase< std::complex<double> > {}
Удивительно, но или нет этот подход работает kinda good. Вы можете получить от NumberCruncher
или непосредственно от конкретного специализированного типа. Также возможно предоставить NumberCRuncherReal
для согласования, но это было бы бессмысленно.
Однако это довольно громоздко для кода, и он чувствует раздутый повторный код. Мне нужно предоставить обертки для всех типов ctor, которые у меня есть в базовом классе.
Я недавно натолкнулся который, кажется, делает то, что мне нужно. Но я не могу заставить его работать. Я устал:
const Matrix op_My(typename enable_if<boost::is_complex<Scalar> >::type* dummy = 0) { return g*H_sum_S[2]; };
Это строка в объявлении класса, g++
говорит:
error: expected a constant of type ‘bool’, got ‘boost::is_complex<Scalar>’
Мой вопрос, является ли это хороший метод, чтобы добиться того, что я после? и как мне его написать. Я попытался следовать http://www.boost.org/doc/libs/1_54_0/libs/utility/enable_if.html. Я использую gcc 4.8.1.
Если вы не против введения «негативной изменчивости», 'enable_if' /' disable_if' нормально. Что касается ошибки, попробуйте использовать полнофункциональный 'boost :: enable_if'. Обратите внимание, что 'op_My' должен быть шаблоном с аргументом Scalar. –
«Мне нужно предоставить обертку для каждого типа ctor, который у меня есть в базовом классе» [Не в C++ 11 у вас нет] (http://www.stroustrup.com/C++11FAQ.html#inheriting) , –