Создание экземпляра шаблона C ++ в зависимости от предложения if - PullRequest
6 голосов
/ 18 ноября 2011

В данный момент я делаю:

if(dimension == 2)
{
    typedef itk::Image<short, 2>      ImageType;
    typedef itk::Image<unsigned int, 2>   IntegralImageType;
    m_pApp->train<2, ImageType, IntegralImageType>();
}
else
{
    typedef itk::Image<short, 3>      ImageType;
    typedef itk::Image<unsigned int, 3>   IntegralImageType;
    m_pApp->train<3, ImageType, IntegralImageType>();
}

Но я бы хотел сделать:

    if (dimension == 2)
    DIMENSION = 2;
    else
    DIMENSION = 3;

    typedef itk::Image<short, DIMENSION>      ImageType;
    typedef itk::Image<unsigned int, DIMENSION>   IntegralImageType;
    m_pApp->train<DIMENSION, ImageType, IntegralImageType>();

Я не смог этого сделать, потому что c ++ хочет получить константные переменные дляшаблонный экземпляр.Есть ли такой способ сделать это все же?

Ответы [ 2 ]

11 голосов
/ 18 ноября 2011

Вы можете определить функцию с параметром шаблона:

template<unsigned N>
void train(){
    typedef itk::Image<short, N>      ImageType;
    typedef itk::Image<unsigned int, N>   IntegralImageType;
    m_pApp->train<N, ImageType, IntegralImageType>();
}

, затем:

if (dimension == 2)
    train<2>();
else
    train<3>();

Обратите внимание, что этот код создаст оба шаблона (код будетдля них), так как во время компиляции нет способа узнать, какой из них будет использован.

0 голосов
/ 18 ноября 2011

Вы также можете сделать что-то вроде этого:

const int N = DIMENSION == 2 ? 2 : 3;
typedef itk::Image<short, N>      ImageType;     
typedef itk::Image<unsigned int, N>   IntegralImageType;     
m_pApp->train<N, ImageType, IntegralImageType>(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...