возврат шаблона с помощью d-указателя - PullRequest
1 голос
/ 14 февраля 2012

Наличие метода-шаблона, который приводит к определенному классу, иногда очень удобен, и я использую его довольно часто, но, реализуя d-указатель, они перестали работать, потому что я не знаю внутренностей д 'в то время как в заголовочном файле. есть ли какой-нибудь способ, которым работает срезанный сильфон?

    class BlahPrivate;
    class Blah{
    public:
        template<typename T> T*method(){ return static_cast<T*>( d->object ); }
    private:

        BlahPrivate *d;
    }

1 Ответ

2 голосов
/ 14 февраля 2012

Прежде всего, если вы хотите отделить логику приведения от внутренних элементов шаблона, вы можете сделать это с помощью идиомы PIMPL (Pointer to Impl), добавив слой косвенности.По сути, поместите этот шаблон в его собственный заголовок, который включает определение для BlahPrivate.Сделайте это автономным.Затем создайте файл .h, который вызывает указанную выше функцию, за исключением того, что он перенаправляет вызов функции в файл заголовка, который имеет определение BlahPrivate и логику приведения.

Во-вторых, вам, вероятно, лучше просто определить неявноеоператоры преобразования в BlahPrivate для типов, в которые вы хотите преобразовать его ... например, добавив это в свой класс:

operator std::string() { return std::string("This is a BlahPRivate"); }

позволит вам использовать BlahPrivate везде, где ожидается строка - это довольноизящный :) Очевидно, вы бы хотели придать своим приведениям больше смысла.

Не сходите с ума от неявных операторов приведения, иначе это кусает вас в задницу.На самом деле, я думаю, что все это, вероятно, плохая идея, потому что даже ваша предложенная функция затруднит отладку - вместо статической ошибки приведения для плохого типа в вашей строке с ошибкой, вы получите это в этой функции инеобходимо проследить его обратно.

Аналогично, неявное приведение может выполнять приведение (и работу), когда вы этого не хотите: т.е. вы записали свои параметры в функцию в обратном порядке, а std :: string - одно.была автоматически преобразована в неявную функцию выше - неявное приведение снижает вашу безопасность типов. Иногда лучше делать вещи вручную (когда они тривиальны, как актеры) - в конце концов, вам действительно не нужно часто кастовать - если вы делаете это, это часто является признаком плохого дизайна, и вы должны переосмыслить то, что вам нужно.делаешь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...