相关疑难解决方法(0)

我必须在何处以及为何要使用"模板"和"typename"关键字?

在模板,在那里,为什么我必须把typenametemplate上依赖的名字呢?究竟什么是依赖名称?我有以下代码:

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++ templates c++-faq dependent-name typename

1061
推荐指数
8
解决办法
15万
查看次数

从std :: function返回类型的模板参数类型推导与lambda

首先,我正在使用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)

c++ c++11

10
推荐指数
1
解决办法
2702
查看次数

"手动"签名重载决议

我想创建一个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)

c++ templates overload-resolution c++11

8
推荐指数
1
解决办法
485
查看次数

在Windows 7上使用clang和codeblocks

我已经设法使用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的头文件但是如何实现呢?

谢谢!

c++ codeblocks clang

4
推荐指数
1
解决办法
9545
查看次数

如何使用lambda在std :: function参数中推导出模板类型?

我有一个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)

c++ lambda templates type-inference c++11

4
推荐指数
1
解决办法
1560
查看次数