gpt4 book ai didi

c++ - 在模板中,如果从属名称是函数,则调用它

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:10:45 26 4
gpt4 key购买 nike

在我的 TClass<T>::foo()函数,我想调用一个 T实例当且仅当 T是函数类型。

#include <iostream>
#include <functional>

template<class T>
struct TClass
{
TClass(T value) : value(value) {}
T value;
void foo()
{
// if(value is std::function)
// call function;
}
};

int main()
{
TClass<int> t1{0};
t1.foo();
TClass<std::function<void()>> t2{[](){ std::cout << "Hello, World!\n"; }};
t2.foo();
}

我该怎么做?

最佳答案

在 C++11 中,最简单的方法是通过辅助函数重新推导值:

template <typename U>
auto foo_helper(U const& f, int) -> decltype(f()) {
return f();
}

template <typename U>
void foo_helper(U const&, long) {}

void foo() {
foo_helper(value, 0);
}

0int 的转换比到 long 的转换要好,所以如果第一个重载是可行的 - 它将是首选.如果第一个重载不可行,那么我们调用第二个。


如果你真的关心std::function,那么我们可以有更简单的重载:

void foo_helper(std::function<void()> const& f) {
f();
}

template <typename T>
void foo_helper(T const&) { }

void foo() {
foo_helper(value);
}

关于c++ - 在模板中,如果从属名称是函数,则调用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50822593/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com