通过参数而不是类型来进行模板专业化

时间:2019-05-25 00:29:42

标签: c++ templates sfinae

是否可以通过参数而不是类型来专门化模板类?

目标是拥有一个舒适的界面,并尽可能减少执行时间。 目前,我知道三种具有不同好处的选择。

  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;
}

the above code in coliru

1 个答案:

答案 0 :(得分:0)

谢谢大家-对于所有可能找到此问题而不是Using template instead of switch的人

/**
 * 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;}
};

working sample of all (listed) possibilities