在运行时识别模板类型名称

时间:2015-03-14 16:17:42

标签: c++ templates

我需要你的专家帮助以下这个小代码:

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

我需要这个来测试小于零的双打。 谢谢!

3 个答案:

答案 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运算符,也可以重载方法。