在模板,在那里,为什么我必须把typename和template上依赖的名字呢?究竟什么是依赖名称?我有以下代码:
template <typename T, typename Tail> // Tail will be a UnionNode too.
struct UnionNode : public Tail {
// ...
template<typename U> struct inUnion {
// Q: where to add typename/template here?
typedef Tail::inUnion<U> dummy;
};
template< > struct inUnion<T> {
};
};
template <typename T> // For the last node Tn.
struct UnionNode<T, void> {
// ...
template<typename U> struct inUnion {
char fail[ -2 + (sizeof(U)%2) ]; // Cannot be instantiated for any …Run Code Online (Sandbox Code Playgroud) 首先,我正在使用C++ 11(我的主题很糟糕).
我要做的是编写一个通用模板函数,它实现了通常sort_by在其他编程语言中调用的东西.它涉及精确计算一个范围的每个成员的任意标准,然后根据这些标准对该范围进行排序.这样的标准不一定是POD,它必须是低于可比性的.对于std::less不起作用的东西,调用者应该能够提供她自己的比较函子.
我已经成功编写了使用以下签名的函数:
template< typename Tcriterion
, typename Titer
, typename Tcompare = std::less<Tcriterion>
>
void
sort_by(Titer first, Titer last,
std::function<Tcriterion(typename std::iterator_traits<Titer>::value_type const &)> criterion_maker,
Tcompare comparator = Tcompare()) {
}
Run Code Online (Sandbox Code Playgroud)
它可以像这样使用:
struct S { int a; std::string b; double c; };
std::vector<S> s_vec{
{ 42, "hello", 0.5 },
{ 42, "moo!", 1.2 },
{ 23, "fubar", 0.2 },
};
sort_by1< std::pair<int, double> >(
s_vec.begin(), s_vec.end(),
[](S const &one_s) { return std::make_pair(one_s.a, one_s.c); }
); …Run Code Online (Sandbox Code Playgroud) 我想创建一个std::function类似的对象,可以处理存储多个重载.
语法排序如下:my_function< int(double, int), double(double, double), char(int, int) >.
或者,更明确地说:
template<typename... Ts>
struct type_list {};
template<typename... Signatures >
struct my_function {
std::tuple< std::function<Signatures>... > m_functions;
typedef type_list< Signatures... > sig_list;
template<typename... Args>
typename pick_overload_signature< sig_list, type_list<Args...> >::return_value
operator()( Args&&... args )
{
return get<pick_overload_signature< sig_list, type_list<Args...> >::index>(m_functions)(std::forward<Args>(args)...);
}
};
Run Code Online (Sandbox Code Playgroud)
我的问题:我该怎么写pick_overload_signatures?
以下是我所做的工作:
我倾向于在函数签名上写一个关于给定参数集的部分顺序,然后对函数签名的类型列表进行排序,然后获取最佳(可能是编译时断言,最好的一个是唯一的).为了解决这个问题,我必须在函数签名上有一个可靠的部分顺序(相对于传入的一组参数)...
13.3.3.1告诉我如何确定是否有有效的转换.我可以通过使用编译器为我做转换来欺骗这个,并使用SFINAE来检测传入的给定参数是否发生以及其中一个"重载"的签名.
13.3.3.2告诉我如何订购这些转换.在这里,我必须检测转换序列是用户定义还是标准序列.我不确定如何区分这两者.
也许我可以使用traits类来检测用户定义的转换序列的存在.检查的存在&S::operator D()和&D::D(S const&)和&D::D(S)和&D::D(S&&)或类似的东西.
has_user_defined_conversion<S,D>::value,has_standard_conversion<S,D>::value等?
这种方法是否有效,有人已经完成了,或者有人已经完成了部分工作吗?
#include <type_traits>
#include …Run Code Online (Sandbox Code Playgroud) 我已经设法使用Visual Studio 210在Windows 7上构建clang,现在我喜欢将它与codeblocks IDE一起使用.所以我将clang可执行文件复制到mingw bin \文件夹中并更新了codeblock的编译器设置以使用clang而不是gcc.
但是当我编译hello world示例时,我得到以下错误:
||=== clang_test, Debug ===|
obj\Debug\main.o:c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\system_error|447|undefined reference to `std::iostream_category()'|
obj\Debug\main.o:c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\stdexcept|170|undefined reference to `std::exception::exception(char const* const&)'|
||=== Build finished: 2 errors, 0 warnings ===|
Run Code Online (Sandbox Code Playgroud)
我想我必须使用clang的头文件但是如何实现呢?
谢谢!
我有一个boost :: variant,我想只在变量属于特殊类型时才执行仿函数,所以我编写了这个函数:
template<typename T, typename Variant>
void if_init(Variant& opt_variant, std::function<void(T)> functor){
if(auto* ptr = boost::get<T>(&opt_variant)){
functor(*ptr);
}
}
Run Code Online (Sandbox Code Playgroud)
这很好用,但我希望推导出类型T,这样我就可以写出:
if_init(b, [](double var){ std::cout << "I'm double and set" << std::endl; });
Run Code Online (Sandbox Code Playgroud)
但是没有推断出类型:
type_inference.cpp:19:5: error: no matching function for call to 'if_init'
if_init(b, [](double var){ std::cout << "I'm double and set" << std::endl; });
^~~~~~~
type_inference.cpp:10:6: note: candidate template ignored: failed template argument deduction
void if_init(Variant& opt_variant, std::function<void(T)> functor){
Run Code Online (Sandbox Code Playgroud)
如果我写:
if_init<double>(b, [](double var){ std::cout << "I'm double and set" << …Run Code Online (Sandbox Code Playgroud)