- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个函数对象,它是另一个函数的包装器:
template <typename FuncT>
class Wrapper
{
private:
FuncT funcToWrap;
public:
Wrapper(FuncT ftw) : funcToWrap(ftw){};
template<typename ...ARG>
typename std::result_of<FuncT(ARG&&...)>::type operator()(ARG&&... args){
return funcToWrap(std::forward<ARG>(args)...);
}
};
int main(){
std::function<void()> testfunc = [](){ std::cout << "Test" << std::endl; };
Wrapper<decltype(testfunc)> test{testfunc};
test();
}
我想做的是标记operator()
作为[[nodiscard]]
如果std::result_of<FuncT(ARG&&...)>::type
不是 void
.
我注意到当我把 [[nodiscard]]
如果返回类型的模板评估为 void
,它只会被我的编译器忽略。
这是我可以依赖的行为吗?它是否以任何方式标准化?
最佳答案
您可以使用 SFINAE 在两个重载的 operator ()
之间进行选择:其中一个返回 void,另一个用于其余用 [[nodiscard]]
属性:
#include <type_traits>
#include <iostream>
template <typename FuncT>
class Wrapper
{
private:
FuncT funcToWrap;
public:
Wrapper(FuncT ftw) : funcToWrap(ftw) {}
template <typename ...ARG, typename T = std::invoke_result_t<FuncT, ARG...>>
std::enable_if_t<std::is_void_v<T>> operator()(ARG&&... args) {
std::cout << "Test 1" << std::endl;
return funcToWrap(std::forward<ARG>(args)...);
}
template <typename ...ARG, typename T = std::invoke_result_t<FuncT, ARG...>>
[[nodiscard]] std::enable_if_t<!std::is_void_v<T>, T> operator()(ARG&&... args) {
std::cout << "Test 2" << std::endl;
return funcToWrap(std::forward<ARG>(args)...);
}
};
int main() {
auto testfunc1 = [] { };
Wrapper test1{testfunc1};
test1(); // <-- No warnings should be issued here
auto testfunc2 = [] { return 0; };
Wrapper test2{testfunc2};
test2(); // <-- Warning issued here
}
关于c++ - 模板参数依赖 [[nodiscard]],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56557786/
C++17 在 p0189r1 中引入了新属性 [[nodiscard]] .当一个函数被这个属性修饰时,返回类型不能被丢弃。如果它被丢弃,则会发出警告。 例子: [[nodiscard]] void
C++17 有一个新属性,[[nodiscard]]。 假设我有一个 Result 结构,它有这个属性: struct [[nodiscard]] Result { }; 现在,如果我调用返回 Res
我想使用第三方函数,它通过充满函数指针的结构提供其 API。例如: struct S { using p_func1 = int(*)(int, int); p_func1 func1
我有一个函数对象,它是另一个函数的包装器: template class Wrapper { private: FuncT funcToWrap; public:
从 C++20 开始,[[nodiscard]]可以应用于构造函数。 http://wg21.link/p1771有例子: struct [[nodiscard]] my_scopeguard { /
在哪些用例中使用 [[nodiscard]] 有益类型? 关于类型,[[nodiscard]]如果任何返回该类型实例的函数的返回值被省略,则发出警告; (引自 p0068r0): If [[nodis
我正在尝试测试一些 C++17。我正在尝试: [[nodiscard]] int get_value1() { return 42; } inline void start() { /
C++17 标准中引入的 [[nodiscard]] 属性,如果是 ... potentially-evaluated discarded-value expression,..., implemen
应用于函数时,[[nodiscard]]属性鼓励编译器在被丢弃的表达式中使用而不是强制转换为 void 时发出警告。示例: [[nodiscard]] int callable_return_not_
说我有 [[nodiscard]] int foo () { return 0; } int main () { foo (); } 然后 error: ignoring return
在 C++ 中,我们可以使用“[[nodiscard]]”来装饰我们的返回类型,如果结果未使用,则会触发编译器警告。 这对于强制执行错误代码特别有用 auto dont_forget_to_check
由于 this问题和答案,属性是否被继承并不是 100% 清楚,但可能不是,因为它没有在标准中说明。这就是为什么如果我们只有标记为 nodiscard 的声明在基类中,并使用 Clang 编译,如果我
我想防止人们在不处理返回值的情况下调用 lambda。 Clang 4.0 拒绝我尝试过的一切,使用 -std=c++1z 进行编译: auto x = [&] [[nodiscard]] () {
我有一个 C++ 项目,其中 clang-tidy建议添加[[nodiscard]]到处。这是一个好习惯吗?我的理解是[[nodiscard]]仅当忽略返回值对程序可能是致命的时才应使用。我有一个对象
我想知道是否有办法拥有这样的东西: using CallbackType = std::function; (我知道上面的代码不会被编译并提示 nodiscard 不能应用于类型!) 我的目标是强制回
您可以使用 [[nodiscard]] 属性声明一个类。当您从此类的语义中知道无论何时从函数返回它都必须用于某些事情时,它可能很有用。我有这种情况,用 [[nodiscard]] 标记类而不是返回它的
C++17 已添加 [[nodiscard]] . C++20 添加了 [[nodiscard]] 的使用在 empty方法,例如 vector::empty() -- 可能是为了避免用户混淆 cle
我有一个标有 C++17 的 [[nodiscard]] 的结构属性。它是这样定义的: struct [[nodiscard]] MyObject final { explicit MyObj
我需要非 C++17 代码库中 [[nodiscard]] 属性的语义。我想在 C++17 之前有依赖于编译器的方法可以实现这一点。有谁知道这些?我对 clang、gcc 和 MSVC 感兴趣。 最佳
最近发布了 Visual Studio 2019 的 16.9.5 版本。它显然引入了新的警告: [[nodiscard]] __declspec(dllexport) bool foo(); //o
我是一名优秀的程序员,十分优秀!