在编译时获取C ++ 03上数据成员的类型

时间:2019-03-09 09:24:05

标签: c++ templates member c++03

以下代码尝试为具有不同类型的条目的通用表建模(其中每个条目都包含键和值)。
在函数“ compareKeyWithEntry()”中,我们需要使用相关键的类型作为成员函数的签名。为此,使用了decltype。

#include <iostream>

struct Key {
    int a;
};

bool operator ==(const Key &key_1, const Key &key_2) {
    return  ( key_1.a == key_2.a );
}

struct Value {
    int b;
};

struct Entry {
    Key key;  
    Value val;
};


template <typename Entry>
class Table 
{
public:

    Table(){}

    template <typename Key_T = decltype(Entry::key)>
    bool compareKeyWithEntry(const Entry& entry, const Key_T& key) {
        return operator==(entry.key, key);
    } 
};

int main()
{
    Entry e = { { 1, 2} };

    Table<Entry> table;
    std::cout << table.compareKeyWithEntry(e, e.key) << std::endl;
}

当前代码可以正常运行并达到目标。但是,没有'decltype'是否有可能获得相同的结果? (使用C ++ 03)

1 个答案:

答案 0 :(得分:0)

您无法获得成员的类型,但是SFINAE可以通过询问某种类型是否与成员的类型相同来实现所需的目标。

void __os_wait_ms(unsigned int ms)
{
    struct OS_task * current;
    current = &OS_tasktable.task_list[OS_tasktable.current_task];
    current->delay = ms * OS_tasktable.delay_factor;
    OS_Scheduler();
    return;
}

https://godbolt.org/z/V_N9ME

如果您要像问题typedef char yes_type; struct no_type { char arr[2]; }; template <typename Key, typename Entry> struct is_key_of { private: static yes_type test(Key Entry::*); static no_type test(...); public: static bool const value = sizeof(test(&Entry::key)) == sizeof(yes_type); }; template <bool> struct static_assertion; template <> struct static_assertion<true> {}; #define OWN_STATIC_ASSERT(x) ((void)static_assertion<(x)>()) struct Key { int a; }; bool operator ==(const Key &key_1, const Key &key_2) { return ( key_1.a == key_2.a ); } struct Value { int b; }; struct Entry { Key key; Value val; }; template <typename Entry> class Table { public: Table(){} template <typename Key_T> bool compareKeyWithEntry(const Entry& entry, const Key_T& key) { OWN_STATIC_ASSERT((is_key_of<Key_T, Entry>::value)); return operator==(entry.key, key); } }; int main() { Entry e = { { 1 }, { 2 } }; Table<Entry> table; table.compareKeyWithEntry(e, e.key); //table.compareKeyWithEntry(e, 0); // static assertation raises } 一样删除过载,则可以在返回类型上用enable_if替换静态断言。