如何检测一个函数。是一个constexpr?并标记其他功能。 constexpr 取决于它吗?
How to detect if a func. is a constexpr? and mark other func. constexpr depending on it?
假设我有一些函数模板 f1:
template<typename f2>
int f1(int i, int j) noexcept {
return i + j + f2(i, j);
}
有没有办法确定 f2(i, j)
是否可以是 constexpr
。 (无论它是函数还是函子)所以也将 f1<f2>
标记为 constexpr
?
我正在考虑如何在这里使用 SFINAE,但没有找到如何使用 type traits
检测 constexpr
检查函数(例如 foo
)是否为 constexpr
的最简单方法是将其 return 值分配给 constexpr
,如下所示:
constexpr auto i = foo();
如果 returned 值不是 constexpr
编译将失败。
如果您想要 SFINAE 测试来检查函数(例如,foo
)是否为 constexpr
,您可以使用 std::integral_constant
类型特征:
std::integral_constant<int, foo()>::value
您可以将 f1
标记为 constexpr
。
template<typename f2>
constexpr int f1(int i, int j) noexcept {
return i + j + f2(i, j);
}
模板函数 f1
将是 constexpr
iif f2
是。
如果 f2
不是,只有在常量编译时表达式中使用 f1
时才会出错。
所以,最后,使用 Jarod42 提示,我编写并测试了 this example:
#include <string>
std::string S = "123567876";
constexpr size_t p() noexcept {
return 10U;
}
template<const size_t = size_t()>
constexpr size_t f(size_t i, size_t j) noexcept {
return std::move(i + j + S.size() + p());
}
#include <iostream>
int main() {
// static constexpr const auto v = f<>(1U, 2U); // error!
std::cout << f(1U, 2U) << "\n";
return 0;
}
现在它可以正常工作了,我使用 GCC 在线编译器对 C++11 和 C+14 进行了测试。
如果可能的话,您可以通过删除 '+ S.size()' 来证明它确实是 constexpr:
...
return std::move(i + j + p());
...
并取消注释 constexpr 值:
...
static constexpr const auto v = f(1U, 2U);
std::cout << v << "\n";
...
参见 here。
P. S.谢谢你们!
假设我有一些函数模板 f1:
template<typename f2>
int f1(int i, int j) noexcept {
return i + j + f2(i, j);
}
有没有办法确定 f2(i, j)
是否可以是 constexpr
。 (无论它是函数还是函子)所以也将 f1<f2>
标记为 constexpr
?
我正在考虑如何在这里使用 SFINAE,但没有找到如何使用 type traits
检测constexpr
检查函数(例如 foo
)是否为 constexpr
的最简单方法是将其 return 值分配给 constexpr
,如下所示:
constexpr auto i = foo();
如果 returned 值不是 constexpr
编译将失败。
如果您想要 SFINAE 测试来检查函数(例如,foo
)是否为 constexpr
,您可以使用 std::integral_constant
类型特征:
std::integral_constant<int, foo()>::value
您可以将 f1
标记为 constexpr
。
template<typename f2>
constexpr int f1(int i, int j) noexcept {
return i + j + f2(i, j);
}
模板函数 f1
将是 constexpr
iif f2
是。
如果 f2
不是,只有在常量编译时表达式中使用 f1
时才会出错。
所以,最后,使用 Jarod42 提示,我编写并测试了 this example:
#include <string>
std::string S = "123567876";
constexpr size_t p() noexcept {
return 10U;
}
template<const size_t = size_t()>
constexpr size_t f(size_t i, size_t j) noexcept {
return std::move(i + j + S.size() + p());
}
#include <iostream>
int main() {
// static constexpr const auto v = f<>(1U, 2U); // error!
std::cout << f(1U, 2U) << "\n";
return 0;
}
现在它可以正常工作了,我使用 GCC 在线编译器对 C++11 和 C+14 进行了测试。
如果可能的话,您可以通过删除 '+ S.size()' 来证明它确实是 constexpr:
...
return std::move(i + j + p());
...
并取消注释 constexpr 值:
...
static constexpr const auto v = f(1U, 2U);
std::cout << v << "\n";
...
参见 here。
P. S.谢谢你们!