代码之家  ›  专栏  ›  技术社区  ›  Brett Rossier

在C++中键入相等性测试W/DeCype()、AutoR或RTTI?Boost有什么用吗?

  •  2
  • Brett Rossier  · 技术社区  · 15 年前

    我正在编写一些代码,将C++类型转换为SQL数据库的适当类型。我想确定类型,然后根据它是什么,生成适当的SQL代码。我不确定在这方面使用rtti、auto或decltype可以做什么。我有一些想法,但我不确定它们是否可行。

    例如(我知道下面可能不是有效的C++,我只是想把这个想法理解过来):

    if (decltype(some_var) == int) { do_stuff(); }
    

    if (decltype(some_var) == decltype(1) { do_stuff(); }
    

    switch(decltype(some_var)) {
        case int:
            do_int_stuff();
            break;
        case string;
            do_string_stuff();
            break;
        case bool;
            do_bool_stuff();
            break;
    }
    

    string get_func_y(int var) {
        ...
        return my_string;
    }
    
    string get_func_y(string var) {
        ...
        return my_string;
    }
    
    string get_func_y(bool var) {
        ...
        return my_string;
    }
    
    ...
    string SQL = get_func_y(some_var);
    

    任何这样的事情看起来都会奏效,或者有人对如何解决这个问题有什么建议吗?提前感谢您提供的任何信息。

    3 回复  |  直到 15 年前
        1
  •  5
  •   David Rodríguez - dribeas    15 年前

    您可以使用简单的元编程函数来确定(在编译时)两种类型是否相同:

    template <typename T, typename U>
    struct same_type 
    {
       static const bool value = false;
    };
    template <typename T>
    struct same_type< T, T >
    {
       static const bool value = true;
    };
    

    这是否真的有助于你的计划是一个不同的问题。我只需要简单的函数重载解决方案。

        2
  •  4
  •   Troubadour    15 年前

    使用简单函数重载的最后一个选项应该可以正常工作。

        3
  •  1
  •   David Thornley    15 年前

    在C++中,变量和函数具有静态类型。唯一可能的混淆,除了滥用强制转换,是指向基类的指针指向基还是派生的。这意味着decltype作为条件(类派生除外)将是无用的,因为它们有一个恒定的答案。

    重载函数在静态类型中工作良好。使用它们。