gpt4 book ai didi

c++ - 检查函数的特征接受某些参数但不返回类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:42:48 26 4
gpt4 key购买 nike

我正在尝试在 c++11 (msvc2013) 中编写一个类型特征,它允许我检查函数类型是否采用某些参数。我希望它检查返回类型。我认为这个想法基本上等同于 std::is_callable,但除了如何实际解决问题之外,我还想知道我的方法有什么问题。

我的实现:

namespace traits
{
namespace detail
{
template <typename T>
struct is_write_function_impl
{
const char* c = nullptr;
size_t l = 0;

template<typename U>
static auto test(U*)->decltype(declval<U>()(c, l), std::true_type);
template<typename U>
static auto test(...)->std::false_type;

using type = decltype(test<T>(0));
};
}

template <typename T>
struct is_write_function : detail::is_write_function_impl<T>::type {};
}

我的测试用例:

std::ofstream os;
auto valid = std::bind(&std::ofstream::write, &os,
std::placeholders::_1, std::placeholders::_2);

// want this to be 'true' but get 'false'
std::cout << traits::is_write_function<decltype(valid)>::value;

最佳答案

有很多问题,可以被更好的编译器检测到 ;) - 但如果你修复它们,你的代码将适用于 VS 2013(使用 12.0.31101.00 Update 4 测试):

static auto test(U*)->decltype(declval<U>()(c, l), std::true_type);
#1 #2 #3
  1. 这应该是 std::declval .
  2. 您不能引用非 static static 声明中的数据成员成员函数,即使在非推导上下文中也是如此。这应该是 (std::declval<char const*>(), std::declval<std::size_t>()) .
  3. std::true_type是一种类型,decltype是一个表达式上下文。写std::true_type{} .

Example .

关于c++ - 检查函数的特征接受某些参数但不返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39081326/

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