模板专用于参数而不是类型

Template specialization by argument instead by type

本文关键字:类型 参数 专用 用于      更新时间:2023-10-16

是否有可能通过参数代替参数?

目标是具有舒适的接口,并且尽可能少。目前,我知道三个有不同好处的选择。

  1. 根据CTOR参数不同的一个类别具有不同Beaviour的课程
  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中的上述代码

谢谢你们 - 对于所有可能找到这个问题而不是使用模板而不是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;}
};

所有(列出(可能性的工作样本