以下代码尝试为具有不同类型的条目的通用表建模(其中每个条目都包含键和值)。
在函数“ 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)
答案 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;
}
如果您要像问题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
替换静态断言。