Можно ли специализировать шаблонный класс по аргументу, а не по типу?
Цель состоит в том, чтобы иметь удобный интерфейс и как можно меньше времени выполнения.На данный момент я знаю три варианта с различными преимуществами.
- Один класс с различным поведением в зависимости от параметра CTor
- Определение различных классов
- Специализированные классы шаблонов
Первая возможность не соответствует требованию времени выполнения.
Вторая возможность не имеет приятного интерфейса, потому что все должны знать, что есть несколько классов с просто немного отличающимся поведением.
Третье решение - мое предпочтение, но поэтому необходимо объявить типы как переключатели.
Так что я ищу смесь между 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