当前位置: 首页 > 知识库问答 >
问题:

如何获取模板的类型,如模板,并检查T是int、浮动还是类

司空宣
2023-03-14

问题简述如下:

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)?

共有3个答案

訾旭
2023-03-14

实现这一目标的一种方法是使用数字限制。但是,这是为了检查它是整数还是浮点数。

您可以执行以下操作:

#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);
}
呼延永新
2023-03-14

您直接提供版本,检查由提供

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

楚硕
2023-03-14

要打印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

  • 是否可以编写一个模板,根据是否在类上定义了某个成员函数来改变行为? 下面是我想写的一个简单的例子: 因此,如果定义了,那么它将使用它;否则就不会。我不知道怎么做的神奇部分是“function_exists”部分。