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

假设我有以下模板:

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>()))>;
    // ...
};


以上是如何在不假设任何构造函数的情况下获取构造函数和解引用运算符(decltype)的类型?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>