Специализация шаблона по аргументу вместо типа - PullRequest
0 голосов
/ 25 мая 2019

Можно ли специализировать шаблонный класс по аргументу, а не по типу?

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

  1. Один класс с различным поведением в зависимости от параметра CTor
  2. Определение различных классов
  3. Специализированные классы шаблонов

Первая возможность не соответствует требованию времени выполнения.

Вторая возможность не имеет приятного интерфейса, потому что все должны знать, что есть несколько классов с просто немного отличающимся поведением.

Третье решение - мое предпочтение, но поэтому необходимо объявить типы как переключатели.

Так что я ищу смесь между 1. и 3.

Могуне хватает правильных ключевых слов для поиска.

Вот возможности, которые я знаю до сих пор:

#include <iostream>

/**
 * opt1 -- switch at runtime
 */
class inoutslow
{
public:
    inoutslow(bool b): _switch(b)
    {
        if(_switch)
            std::cout << "slowIn1" << std::endl;
        else
            std::cout << "slowIn2" << std::endl;
    }
    ~inoutslow()
    {
        if(_switch)
            std::cout << "slowOut1" << std::endl;
        else
            std::cout << "slowOut2" << std::endl;
    }
private:
    bool _switch;
};


/**
 * opt2 -- different self defined classes
 */
class inout1
{
public:
    inout1(){std::cout << "in1" << std::endl;}
    ~inout1(){std::cout << "out1" << std::endl;}
};

class inout2
{
public:
    inout2(){std::cout << "in2" << std::endl;}
    ~inout2(){std::cout << "out2" << std::endl;}
};


/**
 * opt3 -- specialized template 
 */
struct trueType;
struct falseType;

template<typename T>
class inout
{
public:
    inout(){std::cout << "DefaultTin" << std::endl;}
    ~inout(){std::cout << "DefaultTout" << std::endl;}
};
template  <>
class inout<trueType>
{
public:
    inout(){std::cout << "Tin1" << std::endl;}
    ~inout(){std::cout << "Tout1" << std::endl;}
};
template  <>
class inout<falseType>
{
public:
    inout(){std::cout << "Tin2" << std::endl;}
    ~inout(){std::cout << "Tout2" << std::endl;}
};

int main()
{
    inoutslow i(true);
    inoutslow j(false);
    inout1 ii;
    inout2 jj;
    inout<trueType> iii;
    inout<falseType> jjj;
}

код выше в coliru

1 Ответ

0 голосов
/ 25 мая 2019

Спасибо, ребята - всем, кто может найти этот вопрос вместо Использование шаблона вместо переключателя

/**
 * opt 4
 */
template<bool _switch>
class inoutT;
template  <>
class inoutT<true>
{
public:
    inoutT(){std::cout << "TTin1" << std::endl;}
    ~inoutT(){std::cout << "TTout1" << std::endl;}
};
template  <>
class inoutT<false>
{
public:
    inoutT(){std::cout << "TTin2" << std::endl;}
    ~inoutT(){std::cout << "TTout2" << std::endl;}
};

рабочий образец всех (перечисленных) возможностей

...