我需要你的专家帮助以下这个小代码:
template<typename T> void print_element(T t)
{
int width;
if(pre_def_const+2 < 8) width=8;
else width = pre_def_const+2;
cout << left << setw(width) << setfill(' ') << t;
}
此函数只会收到双打和字符串参数,我希望能够在每种情况之间区分。
简而言之,我想在上面的代码中添加类似的东西:
if(T==double) ...
if(T==string) ...
我需要这个来测试小于零的双打。 谢谢!
答案 0 :(得分:4)
此功能仅接收双打和字符串参数
然后它不应该是一个模板。而是创建两个重载函数:
void print_element(double d);
void print_element(std::string const& s);
从技术上讲,是一种非常接近您所需语法的语言结构:typeid
。这根本不是一个好的解决方案,所以我只是为了完整性而发布一个例子,而不是因为我建议你在真实代码中这样做:
#include <iostream>
#include <typeinfo>
#include <iomanip>
#include <string>
int pre_def_const = 10;
int left = 20;
template<typename T> void print_element(T t)
{
if (typeid(t) == typeid(double))
{
std::cout << "double instantiation of template called\n";
}
int width;
if(pre_def_const+2 < 8) width=8;
else width = pre_def_const+2;
std::cout << left << std::setw(width) << std::setfill(' ') << t;
}
int main()
{
print_element(1.0);
std::cout << "\n";
print_element("x");
}
答案 1 :(得分:1)
你可以这样做:
if(std::is_same<T,double>::value){/*do somemthing*/}
if(std::is_same<T,std::string>::value){/*do somemthing*/}
请务必加入#include <type_traits>
答案 2 :(得分:0)
您可以使用typeid
运算符,也可以重载方法。