有没有办法对非可调用函数的结果进行decltype?

时间:2017-06-12 21:03:57

标签: c++ c++11 decltype

我想知道是否有人有相同的技巧来查找find_me函数的返回类型,而不更改它的参数。

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多次重载,从未实际执行过。我只是想知道当函数有这些形式时是否有办法找到返回类型。我知道接收指针或引用是可能的,这就是我已经在做的事情,但我想知道是否还有一些技巧可以使它工作。

如果有,请告诉我,并告诉我原因。

感谢。

3 个答案:

答案 0 :(得分:5)

这有效:

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的每次重载。如果扣除成功只有一个重载,那么选择一个重载来实例化模板。

我认为这是一个纯粹的学术练习,因为按价值采用不可构造类型的函数不能用于实际目的。

答案 1 :(得分:0)

std::declval可以解决问题:

stringr::str_extract

答案 2 :(得分: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;