2017-06-12 47 views
2

我想知道是否有人有同样的技巧来找到find_me函数的返回类型,而不改变它的参数。有没有方法来decltype不可调用函数的结果?

struct Stuck { 
    Stuck() = delete; 
    Stuck(Stuck&&) = delete; 
    Stuck(const Stuck&) = delete; 
    Stuck& operator=(Stuck&&) = delete; 
    Stuck& operator=(const Stuck&) = delete; 
}; 

double find_me(Stuck); 

int main() { 
    // This obviously don't work 
    decltype(find_me(Stuck{})) test1; 
} 

这是一个镜头我想:

template<typename T> 
struct ConvertTo { 
    operator T(); 
} 

int main() { 
    decltype(find_me(ConvertTo<Stuck>{})) test1; 
} 

功能find_me超载很多很多次,从来没有真正实施。我只想知道当函数具有这些形式时是否有办法找到返回类型。我知道有可能收到一个指针或引用,这是我已经做的,但我想知道是否还有一些技巧可以使这个工作。

如果有,请告诉我,并告诉我为什么。

谢谢。

+0

如果它的过载,没有。 –

+0

@ T.C。谢谢。然后我会继续使用参考。 –

+0

这个'find_me'函数可能有什么用途,不管它是按值还是按引用? – Brian

回答

4

这工作:

struct Stuck { 
    Stuck() = delete; 
    Stuck(Stuck&&) = delete; 
    Stuck(const Stuck&) = delete; 
    Stuck& operator=(Stuck&&) = delete; 
    Stuck& operator=(const Stuck&) = delete; 
}; 

double find_me(Stuck); 
void find_me(double); 

template <typename Ret> 
Ret get_stuck_return_type(Ret (*)(Stuck)); 

int main() { 
    decltype(get_stuck_return_type(find_me)) test1; 
} 

Coliru链接:http://coliru.stacked-crooked.com/a/7eca81a13fae9de3

之所以当find_me超载这部作品甚至是模板参数推导将尝试每个超载的find_me。如果扣除只有一次重载成功,那么将选择一个用于实例化模板。

我认为这是一个纯粹的学术练习,因为一个函数根据值构造一个不可构造的类型并不能达到实际的目的。

+0

是的,该函数将有一个目的。我用它来将某种类型映射到另一种类型。该功能从未实现。我在元编程环境中使用它。 –

+2

如果有任何'find_me'是模板,则不起作用。 'template void find_me(double,T);'会杀死它。 –

+0

@ T.C。我同意,我不认为这个问题有一个通用的解决方案。 OP确实应该重新考虑他的设计目标。 – Brian

0

std::declval的伎俩:

decltype(find_me(std::declval<Stuck>())) test1; 
+2

'使用已删除的函数'Stuck :: Stuck(Stuck &&)'' –

0

如何让用户添加模板专业化?

您的代码:

template <typename T> 
struct find_me 
{ 
    struct please_add_your_own_find_me {}; 
    using type = please_add_your_own_find_me; 
}; 

客户端代码:

template <> 
struct find_me<Stuck> 
{ 
    using type = double; 
}; 

然后:

find_me<Stuck>::value test1; 
相关问题