gpt4 book ai didi

c++ - 缺少类型的模板函数(运行时未使用)函数

转载 作者:太空狗 更新时间:2023-10-29 20:40:19 24 4
gpt4 key购买 nike

假设我有这样的模板函数

template <typename T> bool func(T a)
{
if(a.X())
return a.Y();
return false;
}

现在我用作此函数参数的每个类都有函数 X(),但并非我用作参数的每个类都具有函数 Y()。但是,如果函数 a.X() 返回 true,那么我保证给定的类具有函数 Y()。我可以让这段代码以某种方式编译吗,因为我知道永远不会调用编译器提示在某些类型上丢失的函数 Y()?这个功能实际上非常大,使用的类型很多,因此进行大量特化是不切实际的。

最佳答案

SFINAE 可能会有所帮助,例如:( https://ideone.com/XmjQY8 )

#include <type_traits>
#include <cstdint>

#define DEFINE_HAS_SIGNATURE(traitsName, funcName, signature) \
template <typename U> \
class traitsName \
{ \
private: \
template<typename T, T> struct helper; \
template<typename T> \
static std::uint8_t check(helper<signature, &funcName>*); \
template<typename T> static std::uint16_t check(...); \
public: \
static \
constexpr bool value = sizeof(check<U>(0)) == sizeof(std::uint8_t); \
}

DEFINE_HAS_SIGNATURE(has_X, T::X, bool (T::*)());
DEFINE_HAS_SIGNATURE(has_Y, T::Y, bool (T::*)());

template <typename T>
typename std::enable_if<has_X<T>::value && has_Y<T>::value, bool>::type
func(T a)
{
if(a.X())
return a.Y();
return false;
}

template <typename T>
typename std::enable_if<!has_X<T>::value || !has_Y<T>::value, bool>::type
func(T /*a*/)
{
return false;
}

关于c++ - 缺少类型的模板函数(运行时未使用)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24628386/

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