gpt4 book ai didi

c++ - (SFINAEd) 模板函数的宏

转载 作者:行者123 更新时间:2023-12-01 14:33:26 27 4
gpt4 key购买 nike

#define BINDINGTEMPLATE template<typename T, typename = typename std::enable_if_t < std::is_same_v<typename std::decay_t<T>, int> || std::is_same_v<typename std::decay_t<T>, std::string> || std::is_same_v<typename std::decay_t<T>, char>>>

这样的做法是不好的吗?

我在同一个类中多次使用这个函数模板。

BINDINGTEMPLATE
void myFunction(int x, int y)
{
// do something specialised based on input template
}

例如,我需要在很多功能中使用它,比如这个:

最佳答案

是的,这是一种不好的做法。不要将宏用于无需宏即可轻松完成的事情。

您可以将长 SFINAE 条件移动到类似的东西中

template <typename T> using foo = std::enable_if_t<...>;

然后你可以简单地写:

template <typename T, typename = foo<T>>
void myFunction(int x, int y)

或者,您可以将条件放入 constexpr 函数或变量模板中,然后在每次使用时编写 enable_if_t

你也可以使用一个概念(需要 C++20):

template <typename T>
concept foo = std::is_same_v<typename std::decay_t<T>, int> || etc;

template <foo T>
void myFunction(int x, int y)

请注意,这种 enable_if_t 的使用(无论您是否正在使用帮助程序 using )都不是很可靠,因为用户可以通过显式绕过它指定第二个模板参数。

更好的方法是:

template <typename T, std::enable_if_t<..., std::nullptr_t> = nullptr>
void myFunction(int x, int y)

除了万无一失之外,这还可以让您根据不同的特征重载函数。

这些概念也解决了这两个问题。

关于c++ - (SFINAEd) 模板函数的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63116258/

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