c++模板检查类型并使用一些特定的函数

C++ templates check the type and use some specific function

本文关键字:函数 检查 类型 c++      更新时间:2023-10-16

是否有机制检测函数中T的类型,并选择正确的方法执行?

我知道我可以写几个函数,如ClassContainerAdv<INT OR FLOAT>::,但我不喜欢这种方式,因为原来的函数是100行代码,我只需要在一行选择正确的方法。因此,如果我将有两个ClassContainerAdv<INT OR FLOAT>::函数—这意味着2x在源文件上使用相同的代码(复制&粘贴)。

的例子:

template <class T>
void ClassContainerAdv<T>::add_data_to_sqlite( const sqlite3* db )
{
[skip]
if ( T == "INT" ) 
        sqlite3_bind_int64(stmt, 1, (it->first) );
else if ( T == "FLOAT" ) 
         sqlite3_bind_double(stmt, 1, (it->first) );
[skip]
}

你可以特殊化你的函数模板。例如:

template<typename T>
void ClassContainerAdv<T>::add_data_to_sqlite( const sqlite3* db );
template<>
void ClassContainerAdv<int>::add_data_to_sqlite( const sqlite3* db )
{
    sqlite3_bind_int64(stmt, 1, it->first);
}
template<>
void ClassContainerAdv<float>::add_data_to_sqlite( const sqlite3* db )
{
    sqlite3_bind_double(stmt, 1, it->first);
}

我将为偏离的部分使用旧的重载集:

// Some overloads
void bind(int i);
void bind(double d);
// etc...
template <class T>
void ClassContainerAdv<T>::add_data_to_sqlite( const sqlite3* db )
{
[skip]
bind(x); // x is double, or int or ...
[skip]
}

将此放入您的代码(从类型相等测试w/decltype(), auto,或RTTI在c++中?Boost有这个功能吗?):

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

然后你可以像这样检查类型:

template <class T>
void ClassContainerAdv<T>::add_data_to_sqlite(const sqlite3* db)
{
    if (same_type<decltype(T), int>().value) 
        sqlite3_bind_int64(stmt, 1, it->first);
    else if (same_type<decltype(T), float>().value) 
        sqlite3_bind_double(stmt, 1, it->first);
    // else if ... etc.
}