问题简述如下:
template <typename T>
void display(T data){
if(is_int(T)) // how to check if T is int in this function is_int
printf("<int> %d", data);
if(is_float(T)) // how to check if T is float in this function is_float
printf("<int> %f", data);
if(is_class(T)) // how to check if T is class in this function is_class
data.display();
}
这里假设T可以是int、float或类的类型。
如果我定义了一些变量并希望使用相同的函数显示它们的值:
int a = 10:
float b = 2.7;
A_Class c;
display(a);
display(b);
display(c);
display(new int(3));
display(new float(1.899));
display(new float(1));
我知道,在C中,有一种检查int和float的解决方案(仅针对打印问题),即使用std::cout,如本问题所述(C模板-如何找到模板类型是基本类型还是类)。
使用d::is_integral::值不适用于这样的情况:
display(new int(3));
display(new float(1.899));
display(new float(1));
因为这些变量是类而不是基本类型。对于这种情况,我们如何判断new int(),new float()的类型(int或float)?
实现这一目标的一种方法是使用数字限制。但是,这是为了检查它是整数还是浮点数。
您可以执行以下操作:
#include<limits>
template <typename T>
void display(T data){
if(std::numeric_limits<T>::is_signed) // how to check if T is int in this function is_int
printf("<int> %d", data);
else // how to check if T is float in this function is_float
printf("<int> %f", data);
}
您直接提供版本,检查由提供
template <typename T>
typename std::enable_if<std::is_same<T, int>::value>::type
display(T data){
printf("<int> %d", data);
}
template <typename T>
typename std::enable_if<std::is_same<T, float>::value>::type
display(T data){
printf("<int> %f", data);
}
template <typename T>
typename std::enable_if<std::is_class<T>::value>::type
display(const T& data){ // you probably don't want to copy the argument
data.display();
}
要打印int
和浮动
值,只需提供分别接受这些类型参数的show()
的重载。对于包含名为show()
的成员函数的对象,可以使用SFINAE选择性地启用show()
的自由函数形式
#include <iostream>
#include <type_traits>
template<typename T>
auto display(T const& t) -> decltype(t.display(), void())
{
std::cout << "display(T const& t)\n";
}
void display(int)
{
std::cout << "display(int)\n";
}
void display(double)
{
std::cout << "display(double)\n";
}
struct foo
{
void display() const
{
std::cout << "foo::display\n";
}
};
struct bar {};
int main()
{
display(10);
display(10.0);
display(foo());
// display(bar()); // doesn't compile
}
实时演示当您调用显示(bar())时会发生什么;
main.cpp:35:18: error: no matching function for call to 'display(bar)'
display(bar()); // doesn't compile
...
main.cpp:5:49: error: 'const struct bar' has no member named 'display'
我有这样的代码 现在,为了打印值,如果T是一个类,我想调用对象的打印函数,但是如果T是一个基本数据类型,我只想使用printf。 那么,如何确定模板类型是基本数据类型还是类?
我正在研究一个矩阵类,它采用整数(short,int,long)和浮点类型(float,double)。我希望某些方法仅限于浮点类型(例如反转方法),而某些方法对于浮点类型和整数类型(例如==运算符)具有不同的实现。我有一种预感,正确的方法是使用boost的“enable_if”和“is_integral”/“is_floating_point”,但我似乎无法让它工作。 我的实现类似于此c半伪代码
我是Java新手。我只做了大约一年的编程。Spring使用模板是什么意思?在Spring,有jdbc模板、jms模板等。。java中的模板类是什么?它们是一种特殊的设计模式还是什么? 提前谢谢你。
问题内容: 我有一个Freemarker模板,其中包含一堆占位符,在处理模板时会为其提供值。如果要提供userName变量,我想有条件地包括模板的一部分,例如: 但是,FreeMarker手册似乎表明if_exists已过时,但是我找不到其他方法来实现这一目标。当然,我可以简单地提供一个额外的布尔变量isUserName,并像这样使用它: 但是,如果有一种方法可以检查userName是否存在,那么
我想递归遍历LinkedHashMap的键和值,并使用ApacheFreeMarker将它们打印到模板中。LinkedHashMap包含作为字符串的键和作为对象的值。这些值可以是LinkedHashMap、ArrayList或字符串。 下面的java源代码返回我想使用freemarker创建的字符串。 输出为: freemarker模板包含以下部分。 使用此模板时,将显示以下错误: 错误显示“ob
我有类似于这个问题用例 我想检查什么类型的实例变量存储在参数中而不引发异常 我想做的是这样的事情 我如何改变这个实现,使它允许我窥视什么类型的参数是持有的 谢谢你的回答,还有几点 我是C++11所以不能使用variant或any 有没有标准的方法。我想要的是一个实例变量的类,可以是多种类型(有界的),并在阅读它时,检查它是什么类型