gpt4 book ai didi

c++ - 如何让编译器推断出模板化 get 函数的正确返回类型?

转载 作者:行者123 更新时间:2023-11-30 01:05:15 25 4
gpt4 key购买 nike

我有一堆结构,都有一些元素:

struct myExample
{
std::string elem0;
int elem1;
};

如果我能让下面的代码工作,我就可以避免很多编码。编写一个模板化的 get 方法,它将索引作为模板参数并从上面的结构返回 elem。

template<int idx, typename K, typename T> T get(const K&) 
{
throw std::runtime_error("should not happen");
}
template<> std::string get<0, myExample, std::string>(const myExample& k)
{
return k.elem0;
}
template<> int get<1, myExample, int>(const myExample& k)
{
return k.elem1;
}

下面是这个例子的主要功能:

int main() 
{
myExample test;
test.elem0 = "hello world";
test.elem1 = 42;

// does not work:
//std::string get0 = ::get<0>(test);
//int get1 = ::get<1>(test);

// does not work either:
//std::string get0 = ::get<0, myExample>(test);
//int get1 = ::get<1, myExample>(test);

// works:
std::string get0 = ::get<0, myExample, std::string>(test);
int get1 = ::get<1, myExample, int>(test);

std::cout<<get0<<":"<<get1<<std::endl;
return 0;
}

我想使用 ::get<0>(test) , 但出于某种原因,编译器提示没有匹配函数来调用“get(myExample&)”即使至少抛出错误的模板化函数应该可用,对吧?

原则上应该可以告诉编译器正确的返回类型,因为 elem0 和 elem1 的类型是在编译时定义的。

我如何扩展这个类似元组的结构以返回正确的类型而无需手动写出它?

到目前为止,这适用于旧的 C++ 版本,这就是我不应该使用 auto 之类的原因。有没有办法让它在没有 C++11 的情况下工作?

Please check out the example on ideone .

非常感谢您的意见!

最佳答案

编译器必须在考虑特化之前推导所有模板参数,并且它无法以这种方式推导T

只需完全删除 typename T 参数即可,不需要。


您可能还想考虑一个更简单的替代方案:

template <int Index, typename T> auto get(const T &object)
{
return std::get<Index>(std::tie(object.elem0, object.elem1, object.elem2));
}

关于c++ - 如何让编译器推断出模板化 get 函数的正确返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48872111/

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