C++ 如何在c+中执行依赖于if-else的类型+;模板? //模板专门化 #包括 使用名称空间std; //类模板: 模板 类霉菌容器{ T元素; 公众: mycontainer(T arg){element=arg;} T增加(){ //if(T.type==int)//如何执行此操作或类似操作? //如果一个int return++元素; //if(T.type==char) //如果((element>='a')&&(element
您可以使用C++ 如何在c+中执行依赖于if-else的类型+;模板? //模板专门化 #包括 使用名称空间std; //类模板: 模板 类霉菌容器{ T元素; 公众: mycontainer(T arg){element=arg;} T增加(){ //if(T.type==int)//如何执行此操作或类似操作? //如果一个int return++元素; //if(T.type==char) //如果((element>='a')&&(element,c++,templates,C++,Templates,您可以使用typeid: // template specialization #include <iostream> using namespace std; // class template: template <class T> class mycontainer { T element; public: mycontainer (T arg) {element=arg;} T increase () { //if(T.ty
typeid
:
// template specialization
#include <iostream>
using namespace std;
// class template:
template <class T>
class mycontainer {
T element;
public:
mycontainer (T arg) {element=arg;}
T increase () {
//if(T.type==int)//how to do this or something similar?
//do this if an int
return ++element;
//if(T.type==char)
//if ((element>='a')&&(element<='z'))
//element+='A'-'a';
//return element;
}
};
或者您可以使用std::is_same
类型特征:
if (typeid(T) == typeid(int))
if(std::is_same::value)
你想要的可能是一个。
不幸的是,C++11对这种语言构造没有本机支持
但是,如果您只想检查两种类型是否相同,那么std::is_same
type特征应该可以帮助您:
if (std::is_same<T, int>::value)
此外,正如注释中正确指出的,编译器可能会发出警告,因为您的条件将始终计算为
true
或false
,因此这两个分支中的一个分支将包含无法访问的代码。简单重载如何
if (std::is_same<T, int>::value)
{
cout << element;
}
else if (std::is_same<T, my_class>::value)
{
element->print(); // Would not compile when T is int!
}
//在私有部分
静态int&do_递增(int&i){return++i;}
静态字符和do_增加(字符和c){
如果(c>='a'&&c,通常的解决方案是转发到重载函数
带一个附加参数。类似于:
// in the private section
static int& do_increase(int& i){ return ++i; }
static char& do_increase(char& c){
if(c >= 'a' && c <= 'z')
c += 'A' - 'a';
return c;
}
template<class U>
static U& do_increase(U& arg){
// some default implementation?
return arg;
}
模板
类霉菌容器
{
T增加(int const*){/*对int*/}的特殊处理
T增加(…){/*默认处理*/}
公众:
T增加()
{
收益增加((T常数*)0);
}
};
只要有一点想象力,你就能想出各种各样的办法
区别。如果你用额外的
参数模板,您甚至可以利用SFINAE:design
伪参数,使模板类型替换失败,以及
在过载设置中不考虑该功能。以及
因为所有函数都是内联的,所以很可能
如果您进行优化,将不会产生额外的开销。这与Andy Prowls的答案一致,但都是在编译时使用具有专门化的最小帮助器类完成的
在本例中,您有一个实际执行专门化的helper,但您也可以让helper类只接受一个bool,然后使用类似于std::is_same::value
的内容将该值作为模板参数传递
template <typename T>
class MyContainer
{
T increase( int const* ) { /* special treatment for int */ }
T increase( ... ) { /* default treatment */ }
public:
T increase()
{
return increase( (T const*)0 );
}
};
模板
结构myContainerHelper;
{
//一般情况
静态内联T增加(T元素)
{
return++元素;
}
};
模板
结构myContainerHelper
{
//具体案例
静态内联字符增加(字符元素)
{
如果((element>='a')&&(element),则可以使用显式模板专门化
template <typename T>
struct myContainerHelper;
{
// General Case
static inline T increase(T element)
{
return ++element;
}
};
template <>
struct myContainerHelper<char>
{
// Specific case
static inline char increase(char element)
{
if ((element>='a')&&(element<='z')) element+='A'-'a';
return element;
}
};
template <class T>
class mycontainer
{
T element;
public:
mycontainer (T arg) {element=arg;}
T increase ()
{
return myContainerHelper<T>::increase(element);
}
};
#包括
使用名称空间std;
//类模板:
模板
类霉菌容器{
T元素;
公众:
mycontainer(T arg){element=arg;}
T增加();
};
模板
int mycontainer::increase(){
return++元素;
}
模板
char mycontainer::increase(){
如果((元素>='a')&&(elementC++确实有编译时if
:它被称为函数重载解析。这也意味着您会收到未使用的分支的警告。更好的形式是标记分派,我在回答时想到了这一点,但简单的重载也可以做到这一点。@JamesKanze:这与真正的静态方法完全不同if
construct。您可能可以通过简单的重载解析来实现,但它不容易扩展(例如,如果他想为整型类型做一件事,为所有其他类型做另一件事)。@AndyProwl它实现了相同的目的。内部increase
调用不需要模板参数(事实上,这将是一个错误)@Xeo正确。我最初做了一些更通用的事情,这要求两个目标函数是模板(为了让SFINAE发挥作用)。我会在这里解决它。如果有一个static\u If
…也许这会解决同样的问题有很多关于static\u If
的建议,但都有问题。SG8最近写了。@JosephMansfield你提供的链接没有预览。C++17引入了constepr If,这可能是你想要的。我喜欢这个不依赖于任何成员函数参数的解决方案。我需要将*userp
转换为成员函数内的t
模板类型,例如静态大小\u t写回调(void*response,size\t size,size\t nmemb,void*userp)
,具有严格的不可修改签名。
template <typename T>
struct myContainerHelper;
{
// General Case
static inline T increase(T element)
{
return ++element;
}
};
template <>
struct myContainerHelper<char>
{
// Specific case
static inline char increase(char element)
{
if ((element>='a')&&(element<='z')) element+='A'-'a';
return element;
}
};
template <class T>
class mycontainer
{
T element;
public:
mycontainer (T arg) {element=arg;}
T increase ()
{
return myContainerHelper<T>::increase(element);
}
};
#include <iostream>
using namespace std;
// class template:
template <class T>
class mycontainer {
T element;
public:
mycontainer (T arg) {element=arg;}
T increase();
};
template<>
int mycontainer<int>::increase(){
return ++element;
}
template<>
char mycontainer<char>::increase(){
if ((element>='a')&&(element<='z'))
element+='A'-'a';
return element;
}
int main(){
mycontainer<int> A(10);
mycontainer<char> B('x');
cout << A.increase() <<endl;
cout << B.increase() <<endl;
return 0;
}