2012-02-14 2 views
1

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

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

     BlahPrivate *d; 
    } 
+2

Является ли 'd-pointer' термином? С какими проблемами вы сталкиваетесь? – iammilind

+0

Что такое 'BlahPrivate'? Это не параметр шаблона, поэтому вам нужно будет определить его, прежде чем вы сможете разыменовать его (например, получить доступ к его членам). –

+0

, если вы не можете указать заголовочный файл BlahPrivate в файле заголовка Blah, пожалуйста, включите его как .cpp-файл #include #include PermanentGuest

ответ

2

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

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

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

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

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

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

+0

Что я делаю - это приложение с несколькими «ядрами», и они являются плагинами, а ядра также загружают плагины, поэтому это мультиплатформенный модуль, который загружает плагины с множеством отливок. Ответ luskan (как комментарий, на мой пост) работал как шарм. –

Смежные вопросы