gpt4 book ai didi

c++ - 如何在不假设任何构造函数的情况下获取构造函数和取消引用运算符(decltype)的类型?

转载 作者:行者123 更新时间:2023-12-05 09:34:39 27 4
gpt4 key购买 nike

假设我有以下模板:

template<typename T>
struct S
{
typedef decltype(foo(T{})) TypeThatSomeFooFunctionReturns;
typedef decltype(*TypeThatSomeFooFunctionReturns{}) TypeOfDereferenceOfWhateverFooReturns;
...
};

现在,如果类型 T 有一个默认构造函数,并且如果“foo(T)”返回的任何东西也有一个默认构造函数,这就可以正常工作。

但是,如果我既不希望这种假设又支持任何类型 T,而不管它(或任何“foo(T)”)是否提供构造函数,我将如何编写模板? (反正我从来没有自己构造过这些对象)

我想到的一个笨拙的解决方案是强制 struct S 的用户为其参数提供模板特化,基本上将寻找正确类型的工作交给使用 S 的任何人:

template<typename T> struct S_Def { };
// User needs to provide these for each type
template<> struct S_Def<MyType> { typedef int* ReturnOfFoo; typedef int& DerefOfReturnOfFoo; };

template<typename T>
struct S
{
typedef S_Def<T>::ReturnOfFoo TypeThatSomeFooFunctionReturns;
typedef S_Def<T>::DerefOfReturnOfFoo TypeOfDereferenceOfWhateverFooReturns;
...
};

我想避免这种负担。

是否有任何其他方法告诉编译器只接受任何可访问函数“foo(T)”为 typedef 返回的任何类型,然后是该类型上的任何取消引用运算符将​​返回的任何类型?

如果不是,有什么原因吗? (这是不可能的吗?如果歧义导致编译错误,我会没事的。或者编译器很难找到?)

谢谢,伊米。

最佳答案

您可能会使用 std::declval , 和 type_traits 修改类型:

template<typename T>
struct S
{
using TypeThatSomeFooFunctionReturns = decltype(foo(std::declval<T>()));
using TypeOfDereferenceOfWhateverFooReturns =
std::remove_pointer_t<decltype(foo(std::declval<T>()))>;
// ...
};

关于c++ - 如何在不假设任何构造函数的情况下获取构造函数和取消引用运算符(decltype)的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66436095/

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