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

如何确定模板类型是基本类型还是类

籍利
2023-03-14

我有这样的代码

template <typename T> void fun (T value)
{
    .....
    value.print ();  //Here if T is a class I want to call print (), 
                     //otherwise use printf
    .....
}

现在,为了打印值,如果T是一个类,我想调用对象的打印函数,但是如果T是一个基本数据类型,我只想使用printf。

那么,如何确定模板类型是基本数据类型还是类?

共有3个答案

费明诚
2023-03-14

如果您没有C 11支持,另一种选择。

template<typename T>
class isClassT {
private:
    typedef char One;
    typedef struct { char a[2]; } Two;
    template<typename C> static One test(int C::*);
    template<typename C> static Two test(…);
public:
    enum { Yes = sizeof(isClassT<T>::test<T>(0)) == 1 };
    enum { No = !Yes };
};

用于确定类型是否为类类型的简单模板。更多关于C模板的完整指南。

if (isClassT<T>::Yes) {
    std::cout << " Type is class " << std::endl;
}
况博容
2023-03-14

推荐重载运算符

template <typename T> void fun (T value)
{
    .....
    std::cout << value <<  std::endl;
    .....
}

FWIW,std::is_class存在。

王宏扬
2023-03-14

您可以使用std::is_class(也可能使用std::is_union)。具体取决于你对“基本型”的定义。在此查看有关类型支持的更多信息。

但请注意,在C中,通常重载std::ostream

template <typename T> void fun (T value)
{
    std::cout << value << "\n";
}

 类似资料:
  • 我正在研究一个矩阵类,它采用整数(short,int,long)和浮点类型(float,double)。我希望某些方法仅限于浮点类型(例如反转方法),而某些方法对于浮点类型和整数类型(例如==运算符)具有不同的实现。我有一种预感,正确的方法是使用boost的“enable_if”和“is_integral”/“is_floating_point”,但我似乎无法让它工作。 我的实现类似于此c半伪代码

  • 问题简述如下: 这里假设T可以是int、float或类的类型。 如果我定义了一些变量并希望使用相同的函数显示它们的值: 我知道,在C中,有一种检查int和float的解决方案(仅针对打印问题),即使用std::cout,如本问题所述(C模板-如何找到模板类型是基本类型还是类)。 使用d::is_integral::值不适用于这样的情况: 因为这些变量是类而不是基本类型。对于这种情况,我们如何判断n

  • 问题内容: Java中是否有类似“ typeof”的函数来返回原始数据类型(PDT)变量的类型或操作数PDT的表达式? 似乎仅适用于类类型。 问题答案: 请尝试以下操作: 它将打印: 至于,您可以使用其动态对应项:

  • 我如何像这样?也许Boost支持它,如果不是C++或C++11中的新特性?

  • 我一直听说确保最佳性能的最佳实践是: 按值传递基本类型(,..) 通过常量引用传递类 如今,在编译器下使用C 11和完全优化,当通过const引用传递基本类型时是否会产生开销? 此外,当<code>T<code>为<code>int<code>时,将执行以下功能: 慢于: