Специализация шаблона в .cpp
От: _nn_ www.nemerleweb.com
Дата: 02.05.06 15:18
Оценка:
Допустим есть шаблонный класс и известно количество специализаций.
Можно эти специализации реализовать в .cpp через шаблонный класс:
// a.h
// Real implementation
template<typename T>
struct ax
{
 void f(T t);
};

// Specializations implementation
struct aint : ax<int>
{
 typedef ax<int> base;
 void f(int t);
};

struct along : ax<long>
{
 typedef ax<long> base;
 void f(long t);
};

// Selector
// Можно через mpl::if_<is_same...>
template<typename T>
struct a_selector;

template<>
struct a_selector<int>
{
 typedef aint type;
};

template<>
struct a_selector<long>
{
 typedef along type;
};

// Class Template
template<typename T>
struct a  : a_selector<T>::type
{
};

// a.cpp
#include <iostream>

// Real implementation
template<typename T>
void ax<T>::f(T t)
{
 std::cout << t << "\n";
}

// Specializations implementation
void aint::f(int t)
{
 base::f(t);
}

void along::f(long t)
{
 base::f(t);
}

// main.cpp
#include "a.h"

int main()
{
 a<int> x;
 x.f(1);

 a<long> y;
 y.f(1L);
}


В main.cpp используется шаблонный класс, в a.cpp реализация самого шаблона и классы прослойки для перехода из a.h в a.cpp.

Недостатки:
  • Нужно писать полное объявление специализированного класса.
  • Нужно писать реализацию методов класса.

    Сообственно вопрос состоит в том как недостатки убрать, например с помощью препроцессора
  • http://rsdn.nemerleweb.com
    http://nemerleweb.com
    Re: Специализация шаблона в .cpp
    От: Константин Л. Франция  
    Дата: 02.05.06 17:02
    Оценка:
    Здравствуйте, _nn_, Вы писали:

    Сообственно вопрос состоит в том зачем это надо?
    Re[2]: Специализация шаблона в .cpp
    От: _nn_ www.nemerleweb.com
    Дата: 02.05.06 17:04
    Оценка:
    Здравствуйте, Константин Л., Вы писали:

    КЛ>Здравствуйте, _nn_, Вы писали:


    КЛ>Сообственно вопрос состоит в том зачем это надо?


    Чтобы отделить объявление от определения.
    Когда все в заголовочных файлах появляется проблема рекурсивного включения файлов

    А так ее не будет.
    Но это нужнен класс где мы знаем специализации, например basic_string.
    http://rsdn.nemerleweb.com
    http://nemerleweb.com
    Re[3]: Специализация шаблона в .cpp
    От: Константин Л. Франция  
    Дата: 02.05.06 17:08
    Оценка:
    Здравствуйте, _nn_, Вы писали:

    __>Здравствуйте, Константин Л., Вы писали:


    КЛ>>Здравствуйте, _nn_, Вы писали:


    КЛ>>Сообственно вопрос состоит в том зачем это надо?


    __>Чтобы отделить объявление от определения.

    __>Когда все в заголовочных файлах появляется проблема рекурсивного включения файлов

    __>А так ее не будет.

    __>Но это нужнен класс где мы знаем специализации, например basic_string.
    Разве ее так нужно разруливать?
    Re[4]: Специализация шаблона в .cpp
    От: _nn_ www.nemerleweb.com
    Дата: 02.05.06 17:10
    Оценка:
    Здравствуйте, Константин Л., Вы писали:

    КЛ>Здравствуйте, _nn_, Вы писали:


    __>>Здравствуйте, Константин Л., Вы писали:


    КЛ>>>Здравствуйте, _nn_, Вы писали:


    КЛ>>>Сообственно вопрос состоит в том зачем это надо?


    __>>Чтобы отделить объявление от определения.

    __>>Когда все в заголовочных файлах появляется проблема рекурсивного включения файлов

    __>>А так ее не будет.

    __>>Но это нужнен класс где мы знаем специализации, например basic_string.
    КЛ>Разве ее так нужно разруливать?

    А как вы предлагаете ?
    Я хочу реализацию только в .cpp файле.
    export помог бы, но поддержка компиляторами нужна
    http://rsdn.nemerleweb.com
    http://nemerleweb.com
    Re[5]: Специализация шаблона в .cpp
    От: Константин Л. Франция  
    Дата: 02.05.06 17:23
    Оценка:
    Здравствуйте, _nn_, Вы писали:

    __>Здравствуйте, Константин Л., Вы писали:


    КЛ>>Здравствуйте, _nn_, Вы писали:


    __>>>Здравствуйте, Константин Л., Вы писали:


    КЛ>>>>Здравствуйте, _nn_, Вы писали:


    КЛ>>>>Сообственно вопрос состоит в том зачем это надо?


    __>>>Чтобы отделить объявление от определения.

    __>>>Когда все в заголовочных файлах появляется проблема рекурсивного включения файлов

    __>>>А так ее не будет.

    __>>>Но это нужнен класс где мы знаем специализации, например basic_string.
    КЛ>>Разве ее так нужно разруливать?

    __>А как вы предлагаете ?

    __>Я хочу реализацию только в .cpp файле.
    __>export помог бы, но поддержка компиляторами нужна
    ИМХО, шаблоны нужны для написания мексимально абстрактного интерфейса -> минимум используемых типов. Может надо без шаблонов писать?
    Опиши проблему, может я невпопад
    Re: Специализация шаблона в .cpp
    От: rg45 СССР  
    Дата: 02.05.06 17:28
    Оценка:
    "_nn_" <16901@users.rsdn.ru> wrote in message news:1876823@news.rsdn.ru...
    > Допустим есть шаблонный класс и известно количество специализаций.
    > Можно эти специализации реализовать в .cpp через шаблонный класс:
    >
    > // a.h
    > // Real implementation
    > template<typename T>
    > struct ax
    > {
    > void f(T t);
    > };
    > 
    > // Specializations implementation
    > struct aint : ax<int>
    > {
    > typedef ax<int> base;
    > void f(int t);
    > };
    > 
    > struct along : ax<long>
    > {
    > typedef ax<long> base;
    > void f(long t);
    > };
    > 
    > // Selector
    > // Можно через mpl::if_<is_same...>
    > template<typename T>
    > struct a_selector;
    > 
    > template<>
    > struct a_selector<int>
    > {
    > typedef aint type;
    > };
    > 
    > template<>
    > struct a_selector<long>
    > {
    > typedef along type;
    > };
    > 
    > // Class Template
    > template<typename T>
    > struct a  : a_selector<T>::type
    > {
    > };
    >

    >
    > // a.cpp
    > #include <iostream>
    > 
    > // Real implementation
    > template<typename T>
    > void ax<T>::f(T t)
    > {
    > std::cout << t << "\n";
    > }
    > 
    > // Specializations implementation
    > void aint::f(int t)
    > {
    > base::f(t);
    > }
    > 
    > void along::f(long t)
    > {
    > base::f(t);
    > }
    >

    >
    > // main.cpp
    > #include "a.h"
    > 
    > int main()
    > {
    > a<int> x;
    > x.f(1);
    > 
    > a<long> y;
    > y.f(1L);
    > }
    >

    >
    > В main.cpp используется шаблонный класс, в a.cpp реализация самого шаблона и классы прослойки для перехода из a.h в a.cpp.
    >
    > Недостатки:
    >
  • Нужно писать полное объявление специализированного класса.
    >
  • Нужно писать реализацию методов класса.
    >
    > Сообственно вопрос состоит в том как недостатки убрать, например с помощью препроцессора

    Может я не совсем понял задачу, но, по-моему, это все решается при помощи явных запросов на инстанцирование:

    // a.h
    template<typename T>
    struct ax
    {
      void f(T t);
    };
    
    // a.cpp
    template<typename T>
    void ax<T>::f(T t);
    {
      std::cout << t << std::endl;
    };
    
    template struct ax<int>;
    template struct ax<long>;
    template struct ax<const char*>;
    Posted via RSDN NNTP Server 2.0
  • --
    Не можешь достичь желаемого — пожелай достигнутого.
    Re[6]: Специализация шаблона в .cpp
    От: _nn_ www.nemerleweb.com
    Дата: 02.05.06 17:32
    Оценка:
    Здравствуйте, Константин Л., Вы писали:

    КЛ>Здравствуйте, _nn_, Вы писали:


    __>>Здравствуйте, Константин Л., Вы писали:


    КЛ>>>Здравствуйте, _nn_, Вы писали:


    __>>>>Здравствуйте, Константин Л., Вы писали:


    КЛ>>>>>Здравствуйте, _nn_, Вы писали:


    КЛ>>>>>Сообственно вопрос состоит в том зачем это надо?


    __>>>>Чтобы отделить объявление от определения.

    __>>>>Когда все в заголовочных файлах появляется проблема рекурсивного включения файлов

    __>>>>А так ее не будет.

    __>>>>Но это нужнен класс где мы знаем специализации, например basic_string.
    КЛ>>>Разве ее так нужно разруливать?

    __>>А как вы предлагаете ?

    __>>Я хочу реализацию только в .cpp файле.
    __>>export помог бы, но поддержка компиляторами нужна
    КЛ>ИМХО, шаблоны нужны для написания мексимально абстрактного интерфейса -> минимум используемых типов. Может надо без шаблонов писать?
    Может и без, но без них никак =)
    КЛ>Опиши проблему, может я невпопад
    Классический пример это string.
    Допустим есть:
    template<typename T>
    struct string_traits;
    
    template<typename T, typename Traits = string_traits<T> >
    struct string;


    Теперь string_traits он разный для char и wchar_t, т.е. это два разных класса под одним названием, лучше в .cpp их ).
    Если можно string в .cpp засунуть, почему не сделать это ?
    Так при изменении внутреннего кода не нужно будет перекаомпилировать все

    Конкретно еще одна проблема это рекурсивные include-ы:
    // string_traits.hpp
    #include <string.hpp>
    
    template<typename T>
    struct string_traits;

    // string.hpp
    #include <string_traits.hpp>
    
    template<typename T, typename Traits = string_traits<T> >
    struct string;


    Что тут делать ?
    Вы ответите предварительное объявление и будете правы, но когда include происходит для 20 файлов, получается длинная цепочка, которую нужно разорвать как-то..
    И где-то посередине получается, что string это неполный тип, который использовать нельзя, а что делать если нужно ?
    Придется использовать указатель или умный указатель, который поддерживает неполные типы.
    http://rsdn.nemerleweb.com
    http://nemerleweb.com
    Re[2]: Специализация шаблона в .cpp
    От: _nn_ www.nemerleweb.com
    Дата: 02.05.06 17:35
    Оценка:
    Здравствуйте, rg45, Вы писали:

    <skip>

    R>Может я не совсем понял задачу, но, по-моему, это все решается при помощи явных запросов на инстанцирование:


    R>
    R>// a.h
    R>template<typename T>
    R>struct ax
    R>{
    R>  void f(T t);
    R>};
    
    R>// a.cpp
    R>template<typename T>
    R>void ax<T>::f(T t);
    R>{
    R>  std::cout << t << std::endl;
    R>};
    
    R>template struct ax<int>;
    R>template struct ax<long>;
    R>template struct ax<const char*>;
    R>


    А где определение aint::f и along:;f ?
    Ведь они замещают ax<T>::f, и следовательно должны быть определенны.
    Или я не прав ?
    http://rsdn.nemerleweb.com
    http://nemerleweb.com
    Re[7]: Специализация шаблона в .cpp
    От: Константин Л. Франция  
    Дата: 02.05.06 17:38
    Оценка:
    Здравствуйте, _nn_, Вы писали:

    []

    согласен

    __>Конкретно еще одна проблема это рекурсивные include-ы:

    __>
    __>// string_traits.hpp
    __>#include <string.hpp>//это зачем?
    
    __>template<typename T>
    __>struct string_traits;
    __>


    __>
    __>// string.hpp
    __>#include <string_traits.hpp>
    
    __>template<typename T, typename Traits = string_traits<T> >
    __>struct string;
    __>


    __>Что тут делать ?

    __>Вы ответите предварительное объявление и будете правы, но когда include происходит для 20 файлов, получается длинная цепочка, которую нужно разорвать как-то..
    __>И где-то посередине получается, что string это неполный тип, который использовать нельзя, а что делать если нужно ?
    __>Придется использовать указатель или умный указатель, который поддерживает неполные типы.

    если #include <string.hpp> выкинуть, то это должно решить проблему?
    Re[8]: Специализация шаблона в .cpp
    От: _nn_ www.nemerleweb.com
    Дата: 02.05.06 17:44
    Оценка:
    Здравствуйте, Константин Л., Вы писали:

    КЛ>Здравствуйте, _nn_, Вы писали:


    КЛ>[]


    КЛ>согласен


    __>>Конкретно еще одна проблема это рекурсивные include-ы:

    __>>
    __>>// string_traits.hpp
    __>>#include <string.hpp>//это зачем?
    
    __>>template<typename T>
    __>>struct string_traits;
    __>>


    __>>
    __>>// string.hpp
    __>>#include <string_traits.hpp>
    
    __>>template<typename T, typename Traits = string_traits<T> >
    __>>struct string;
    __>>


    __>>Что тут делать ?

    __>>Вы ответите предварительное объявление и будете правы, но когда include происходит для 20 файлов, получается длинная цепочка, которую нужно разорвать как-то..
    __>>И где-то посередине получается, что string это неполный тип, который использовать нельзя, а что делать если нужно ?
    __>>Придется использовать указатель или умный указатель, который поддерживает неполные типы.

    КЛ>если #include <string.hpp> выкинуть, то это должно решить проблему?

    Решает если использовать:
    // string_traits.hpp
    template<typename T>
    struct string;
    
    //...

    Но все равно не решает проблемы перекомпиляции.
    Вот при изменении string_traits все кто используют string.hpp должны перекомпилироваться, вопрос зачем, если достаточно только тех, кто страдает прямой зависимостью от string_traits.
    http://rsdn.nemerleweb.com
    http://nemerleweb.com
    Re[3]: Специализация шаблона в .cpp
    От: rg45 СССР  
    Дата: 02.05.06 17:45
    Оценка:
    "_nn_" <16901@users.rsdn.ru> wrote in message news:1876992@news.rsdn.ru...
    > Здравствуйте, rg45, Вы писали:
    >
    > <skip>
    >
    > R>Может я не совсем понял задачу, но, по-моему, это все решается при помощи явных запросов на инстанцирование:
    >
    > R>
    > R>// a.h
    > R>template<typename T>
    > R>struct ax
    > R>{
    > R>  void f(T t);
    > R>};
    > 
    > R>// a.cpp
    > R>template<typename T>
    > R>void ax<T>::f(T t);
    > R>{
    > R>  std::cout << t << std::endl;
    > R>};
    > 
    > R>template struct ax<int>;
    > R>template struct ax<long>;
    > R>template struct ax<const char*>;
    > R>

    >
    > А где определение aint::f и along:;f ?
    > Ведь они замещают ax<T>::f, и следовательно должны быть определенны.
    > Или я не прав ?

    Ну если реализация нужна именно такая как ты показывал в примере — простое делегирование вызова базовой функции — то все в порядке. А вот если реализация, данная основным шаблоном, не годится по каким то причинам, и прийдется по-разному реализовывать различные специализации, то этот подход не прокатит (Я имею ввиду VC 7.1-8.0, по стандарту то вообще все легко и просто )
    Posted via RSDN NNTP Server 2.0
    --
    Не можешь достичь желаемого — пожелай достигнутого.
    Re[4]: Специализация шаблона в .cpp
    От: _nn_ www.nemerleweb.com
    Дата: 02.05.06 17:54
    Оценка:
    Здравствуйте, rg45, Вы писали:


    R>"_nn_" <16901@users.rsdn.ru> wrote in message news:1876992@news.rsdn.ru...

    >> Здравствуйте, rg45, Вы писали:
    >>
    >> <skip>
    >>
    >> R>Может я не совсем понял задачу, но, по-моему, это все решается при помощи явных запросов на инстанцирование:
    >>
    >> R>
    >> R>// a.h
    >> R>template<typename T>
    >> R>struct ax
    >> R>{
    >> R>  void f(T t);
    >> R>};
    >> 
    >> R>// a.cpp
    >> R>template<typename T>
    >> R>void ax<T>::f(T t);
    >> R>{
    >> R>  std::cout << t << std::endl;
    >> R>};
    >> 
    >> R>template struct ax<int>;
    >> R>template struct ax<long>;
    >> R>template struct ax<const char*>;
    >> R>

    >>
    >> А где определение aint::f и along:;f ?
    >> Ведь они замещают ax<T>::f, и следовательно должны быть определенны.
    >> Или я не прав ?

    R>Ну если реализация нужна именно такая как ты показывал в примере — простое делегирование вызова базовой функции — то все в порядке. А вот если реализация, данная основным шаблоном, не годится по каким то причинам, и прийдется по-разному реализовывать различные специализации, то этот подход не прокатит (Я имею ввиду VC 7.1-8.0, по стандарту то вообще все легко и просто )

    Как раз и прокатит хорошо..
    Нет ведь обязательства делегирования.
    Например если есть char_traits<T>, то можно делегировать только для истинно шаблонных функций, а для нешаблонных своя реализация без делегации
    http://rsdn.nemerleweb.com
    http://nemerleweb.com
    Re[5]: Специализация шаблона в .cpp
    От: rg45 СССР  
    Дата: 02.05.06 17:59
    Оценка:
    "_nn_" <16901@users.rsdn.ru> wrote in message news:1877010@news.rsdn.ru...

    > R>Ну если реализация нужна именно такая как ты показывал в примере — простое делегирование вызова базовой функции — то все в порядке. А вот если реализация, данная основным шаблоном, не годится по каким то причинам, и прийдется по-разному реализовывать различные специализации, то этот подход не прокатит (Я имею ввиду VC 7.1-8.0, по стандарту то вообще все легко и просто )

    > Как раз и прокатит хорошо..
    > Нет ведь обязательства делегирования.
    > Например если есть char_traits<T>, то можно делегировать только для истинно шаблонных функций, а для нешаблонных своя реализация без делегации

    Нет, я имел ввиду, что компиляторы 7.1-8.0 не потянут — ругнутся, что явное инстанцирование для специализации шаблонного класса не поддерживается.
    Posted via RSDN NNTP Server 2.0
    --
    Не можешь достичь желаемого — пожелай достигнутого.
    Re[6]: Специализация шаблона в .cpp
    От: _nn_ www.nemerleweb.com
    Дата: 02.05.06 18:01
    Оценка:
    Здравствуйте, rg45, Вы писали:


    R>"_nn_" <16901@users.rsdn.ru> wrote in message news:1877010@news.rsdn.ru...


    >> R>Ну если реализация нужна именно такая как ты показывал в примере — простое делегирование вызова базовой функции — то все в порядке. А вот если реализация, данная основным шаблоном, не годится по каким то причинам, и прийдется по-разному реализовывать различные специализации, то этот подход не прокатит (Я имею ввиду VC 7.1-8.0, по стандарту то вообще все легко и просто )

    >> Как раз и прокатит хорошо..
    >> Нет ведь обязательства делегирования.
    >> Например если есть char_traits<T>, то можно делегировать только для истинно шаблонных функций, а для нешаблонных своя реализация без делегации

    R>Нет, я имел ввиду, что компиляторы 7.1-8.0 не потянут — ругнутся, что явное инстанцирование для специализации шаблонного класса не поддерживается.

    Ясно
    Как обойти ?
    http://rsdn.nemerleweb.com
    http://nemerleweb.com
    Re[7]: Специализация шаблона в .cpp
    От: rg45 СССР  
    Дата: 02.05.06 18:06
    Оценка:
    "_nn_" <16901@users.rsdn.ru> wrote in message news:1877018@news.rsdn.ru...
    > Здравствуйте, rg45, Вы писали:
    >
    >
    > R>"_nn_" <16901@users.rsdn.ru> wrote in message news:1877010@news.rsdn.ru...
    >
    >>> R>Ну если реализация нужна именно такая как ты показывал в примере — простое делегирование вызова базовой функции — то все в порядке. А вот если реализация, данная основным шаблоном, не годится по каким то причинам, и прийдется по-разному реализовывать различные специализации, то этот подход не прокатит (Я имею ввиду VC 7.1-8.0, по стандарту то вообще все легко и просто )
    >>> Как раз и прокатит хорошо..
    >>> Нет ведь обязательства делегирования.
    >>> Например если есть char_traits<T>, то можно делегировать только для истинно шаблонных функций, а для нешаблонных своя реализация без делегации
    >
    > R>Нет, я имел ввиду, что компиляторы 7.1-8.0 не потянут — ругнутся, что явное инстанцирование для специализации шаблонного класса не поддерживается.
    > Ясно
    > Как обойти ?

    Ждать компилятора с поддержкой export для шаблонов, ну а пока делать что то типа того, что делаешь ты.
    Posted via RSDN NNTP Server 2.0
    --
    Не можешь достичь желаемого — пожелай достигнутого.
    Re[8]: Специализация шаблона в .cpp
    От: _nn_ www.nemerleweb.com
    Дата: 02.05.06 18:17
    Оценка:
    Здравствуйте, rg45, Вы писали:


    R>"_nn_" <16901@users.rsdn.ru> wrote in message news:1877018@news.rsdn.ru...

    >> Здравствуйте, rg45, Вы писали:
    >>
    >>
    >> R>"_nn_" <16901@users.rsdn.ru> wrote in message news:1877010@news.rsdn.ru...
    >>
    >>>> R>Ну если реализация нужна именно такая как ты показывал в примере — простое делегирование вызова базовой функции — то все в порядке. А вот если реализация, данная основным шаблоном, не годится по каким то причинам, и прийдется по-разному реализовывать различные специализации, то этот подход не прокатит (Я имею ввиду VC 7.1-8.0, по стандарту то вообще все легко и просто )
    >>>> Как раз и прокатит хорошо..
    >>>> Нет ведь обязательства делегирования.
    >>>> Например если есть char_traits<T>, то можно делегировать только для истинно шаблонных функций, а для нешаблонных своя реализация без делегации
    >>
    >> R>Нет, я имел ввиду, что компиляторы 7.1-8.0 не потянут — ругнутся, что явное инстанцирование для специализации шаблонного класса не поддерживается.
    >> Ясно
    >> Как обойти ?

    R>Ждать компилятора с поддержкой export для шаблонов, ну а пока делать что то типа того, что делаешь ты.

    Плохо..
    Посему и вопрос как можно улучшить, допустим через препроцессор, генерацию кода в моем подходе
    http://rsdn.nemerleweb.com
    http://nemerleweb.com
    Re[9]: Специализация шаблона в .cpp
    От: rg45 СССР  
    Дата: 02.05.06 19:23
    Оценка: 11 (2)
    "_nn_" <16901@users.rsdn.ru> wrote in message news:1877038@news.rsdn.ru...

    >>> R>Нет, я имел ввиду, что компиляторы 7.1-8.0 не потянут — ругнутся, что явное инстанцирование для специализации шаблонного класса не поддерживается.

    >>> Ясно
    >>> Как обойти ?
    >
    > R>Ждать компилятора с поддержкой export для шаблонов, ну а пока делать что то типа того, что делаешь ты.
    > Плохо..
    > Посему и вопрос как можно улучшить, допустим через препроцессор, генерацию кода в моем подходе

    Предлагаю такой вариант, как мне кажется, убиты все зайцы:
    //a.h
    
    //Класс для контроля типов, с которыми инстанцируется шаблон класса объекта
    //Дается только лишь предварительное объявление.
    //Полные объявления даются только для разрешенных специализаций
    template<typename T> class selector; 
    
    //Шаблон класса объекта
    template<typename T> 
    struct a : selector<T>
    {
      void f(T t);
    };
    
    //Разрешенные типы для инстанцирования (можно одеть в макрос)
    template<> class selector<int>{};
    template<> class selector<long>{};
    template<> class selector<double>{};


    //a.cpp
    #include "a.h"
    
    //основной шаблон
    template<typename T>
    void a<T>::f(T t)
    {
      std::cout << t << std::endl;
    };
    
    //специализация для double
    void a<double>::f(double t)
    {
      std::cout << "double: " << t << std::endl;
    }
    
    //Явное инстанцирование классов, порождаемых основным шаблоном
    template struct a<int>;
    template struct a<long>;


    #include "a.h"
    
    int main()
    {
      a<int> i;
      a<long> l;
      a<double> d;
      //a<char> c; //Ошибка: 'selector<T>' : base class undefined
      
      i.f(333);
      l.f(555);
      d.f(7.77);
    }


    Вывод на экран:

    333
    555
    double: 7.77

    Posted via RSDN NNTP Server 2.0
    --
    Не можешь достичь желаемого — пожелай достигнутого.
    Re[10]: Специализация шаблона в .cpp
    От: _nn_ www.nemerleweb.com
    Дата: 03.05.06 11:15
    Оценка:
    Здравствуйте, rg45, Вы писали:

    <skip>

    Неплохо

    Раз на то пошло, то хотелось бы его развить немного, для возможности добавления специализаций.
    Есть следущая идея:
    // a.h
    ...

    // a.cpp
    
    #include "a_t.cpp"
    
    ...

    // a_t.cpp
    #include "a.h"
    
    template<typename T>
    void a<T>::f(T t)
    {
    }

    // a_char.h
    #include "a.h"
    
    template<> struct selector<char>{};

    // a_char.cpp
    #include "a.h"
    #include "a_t.cpp"
    
    template struct a<char>;

    // main.cpp
    #include "a.h"
    #include "a_char.h"
    
    int main()
    {
     a<char> x;
    }


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

    P.S.
    Если обойти эту проблему, то можно почти свободно реализовать шаблоны в .cpp
    http://rsdn.nemerleweb.com
    http://nemerleweb.com
    Re[5]: Специализация шаблона в .cpp
    От: Chipsеt Россия http://merlinko.com
    Дата: 04.05.06 05:44
    Оценка:
    Здравствуйте, _nn_, Вы писали:

    __>А как вы предлагаете ?

    __>Я хочу реализацию только в .cpp файле.
    __>export помог бы, но поддержка компиляторами нужна

    А почему pImpl не катит?
    ... << RSDN@Home 1.2.0 alpha rev. 648>>
    "Всё что не убивает нас, делает нас сильнее..."
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.