问题描述
假设我有以下模板:
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 (将#修改为@)