如何在不假设任何构造函数的情况下获取构造函数和解引用运算符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 返回的任何类型,然后该类型上的任何解引用运算符将​​返回?

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

谢谢,伊米。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)