gpt4 book ai didi

c++ - 在 C++11 中是否可以支持不同级别的间接寻址的模板函数?

转载 作者:太空狗 更新时间:2023-10-29 20:16:16 25 4
gpt4 key购买 nike

本质上,我很好奇您是否可以使用 C++11 模板来实现它,以便模板化函数可以检测迭代器的间接级别并根据它以不同方式编译函数。例如,下面是一些无法编译的代码:

#include <vector>
#include <list>
#include <type_traits>
#include <iostream>

struct MyStruct
{
int value;
MyStruct(int value = 42) : value(value) { }
const int& getInt() const { return value; }
};

typedef std::list<MyStruct> StructList;
typedef std::vector<const MyStruct*> StructPtrVector;

template <typename ITER_TYPE>
const int& getIteratorInt(ITER_TYPE iter)
{
if (std::is_pointer<decltype(*iter)>::value)
return (*iter)->getInt(); // Won't compile -> MyStruct has no operator-> defined
return iter->getInt(); // Won't compile -> MyStruct* has the wrong level of indirection
}

template <typename LIST_TYPE>
void PrintInts(const LIST_TYPE& intList)
{
for (auto iter = intList.begin(); iter != intList.end(); ++iter)
std::cout << getIteratorInt(iter) << std::endl;
}

int main(void)
{
StructList structList;
StructPtrVector structPtrs;
int values[5] = { 1, 4, 6, 4, 1 };
for (unsigned i = 0; i < 5; ++i)
{
structList.push_back(values[i]);
structPtrs.push_back(&structList.back());
}
PrintInts(structList);
PrintInts(structPtrs);

return 0;
}

最明显的情况是你有一个对象列表,然后是一个不同类型的对象指针列表。而且,您想要对两个列表执行的操作相同,将它们都视为对象列表。

上面的代码不会编译,因为它正在做一个应该在编译时完成的逻辑检查。我不知道是否有办法用预处理器宏来做到这一点。我尝试了一个简单的 #if std::is_pointer<decltype(*iter)>::value == true ,但编译器似乎总是认为它是假的。 (我以前从未尝试过预处理器宏,但这显然不是正确的方法。)

知道这是否可能吗?

最佳答案

当您想根据元函数(例如 is_pointer)在两个实现之间进行选择时,请使用 std::enable_if,它根据 SFINAE 的原理工作。

template <typename ITER_TYPE>
auto getIteratorInt(ITER_TYPE iter) ->
typename std::enable_if< std::is_pointer<
typename std::iterator_traits< ITER_TYPE >::value_type >::value,
const int& >::type
{
return (*iter)->getInt();
}

template <typename ITER_TYPE>
auto getIteratorInt(ITER_TYPE iter) ->
typename std::enable_if< ! std::is_pointer<
typename std::iterator_traits< ITER_TYPE >::value_type >::value,
const int& >::type
{
return iter->getInt();
}

这样,模板实例化只会看到对给定模板参数有效的代码行。

我只是机械地将此修复程序应用到您的代码中……我并不是在提倡使用多重间接寻址,也不是在暗示修复的实现是健壮的。

关于c++ - 在 C++11 中是否可以支持不同级别的间接寻址的模板函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10085049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com