gpt4 book ai didi

c++ - 如何根据模板中的类型有条件地包含一个语句?

转载 作者:行者123 更新时间:2023-12-02 09:51:24 33 4
gpt4 key购买 nike

如果可以将int *或int()函数的参数传递给模板,则如何根据传递给模板的参数来做些不同的事情?

#include <type_traits>


template <typename GetterType>
class Getter
{public:
using isInvokable = std::is_invocable<GetterType>;


using GotValueType = typename std::conditional_t<isInvokable::value,
std::invoke_result<GetterType>,
std::remove_pointer<GetterType>>::type;

Getter(GetterType a) : getter(a) {}

GetterType getter;

GotValueType get() {
if constexpr (isInvokable::value) return getter();
else return *getter;
// EVEN THOUGH INT* ISN'T CALLABLE IT'S STILL TRYING TO CALL GETTER
}


};

int main()
{
int a = 0;
Getter getter(&a);
getter.get();
}
它不会编译,因为它试图调用模板参数类型,即使我传递给它的参数不可调用。并且它尝试返回一个int *而不是一个int。
编辑:有没有办法有条件地编译一件事或另一件事?我认为constexpr用于模板中的这种事情。
Edit2:无法在使用ISO C++ 17 Standard(std:c++ 17)的Visual Studio 19上编译:
'return': cannot convert from 'int' to 'int *'  

最佳答案

is_invocableif constexpr是C++ 17的功能。 MSVC 2019默认情况下以C++ 14模式编译。
要启用C++ 17,请将项目配置为使用/std:c++17/std:c++latest进行编译

自VS 2017开始支持 /std 标志。

关于c++ - 如何根据模板中的类型有条件地包含一个语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64359017/

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