小编Edw*_*uez的帖子

奇怪的typename用法c ++ 11

我有以下代码

#include <iostream>
#include <string>
using namespace std;

template<class T> struct Tpl;
template<>        struct Tpl<int>    { void print() { cout << "int"    << endl; } };
template<>        struct Tpl<string> { void print() { cout << "string" << endl; } };

int main() {
  typename Tpl<int>::Tpl{}.print();
  typename Tpl<int>::Tpl<string>{}.print();
  typename Tpl<int>::Tpl<int>{}.print();
  typename Tpl<int>::Tpl::Tpl{}.print();
  typename Tpl<string>::Tpl<int>{}.print();
  typename Tpl<int>::Tpl::Tpl<int>{}.print();
  typename Tpl<string>::Tpl::Tpl<int>::Tpl{}.print();
  typename Tpl<int>::Tpl<string>::Tpl<int>::Tpl<string>::Tpl<int>::Tpl<string>{}.print();
}
Run Code Online (Sandbox Code Playgroud)

这给出了以下输出

int
string
int
int
int
int
int
string
Run Code Online (Sandbox Code Playgroud)

我的问题是typename在这些情况下是如何工作的,特别是在最后一个可以在不同模板参数之间切换的情况下.我想知道这种行为是标准的还是编译器上的一些奇怪之处.

这是编译器的信息:

> g++ -v
Using built-in specs.
COLLECT_GCC=g++ …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

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

按函数名称c ++ 11参数化模板

具有以下功能

void print(int a) { cout << a << endl; }
void print(std::string a) { cout << a << endl; }
Run Code Online (Sandbox Code Playgroud)

您可以执行以下模板

template <class T> void printT(T a) { print(a); }
Run Code Online (Sandbox Code Playgroud)

是否有一些机制来参数化函数名称? 像这样的东西:

template <class T, class F> void anyT(T a) { F(a); }
Run Code Online (Sandbox Code Playgroud)

我不需要成为一个函数模板,只需要一些机制来实现相同的功能.

c++ templates c++11

6
推荐指数
1
解决办法
418
查看次数

从模板函数调用静态模板方法

我正在尝试做一个调用另一个类的模板静态方法的模板方法,但是我得到了一些编译错误.最小的情况如下.

如果我编译下面的代码

template<class E, class D>
int foo() {
  return D::bar<E>() + 1;
}
Run Code Online (Sandbox Code Playgroud)

它抛出以下输出

g++ -std=c++11 test.cpp -c
test.cpp: In function ‘int foo()’:
test.cpp:4:18: error: expected primary-expression before ‘>’ token
   return D::bar<E>() + 1;
                  ^
test.cpp:4:20: error: expected primary-expression before ‘)’ token
   return D::bar<E>() + 1;
Run Code Online (Sandbox Code Playgroud)

当我替换D::bar<E>D::bar,编译传递所以它似乎与函数的模板参数有一些解析问题.像其他情况一样,我认为它需要一些usingtypename黑客来使其工作.

c++ templates c++11

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

std ::成员指针行为的元组

我想了解这种行为的原因:

这段代码很完美:

#include <iostream>
#include <tuple>

struct SomeClass {
 int v1;
 int v2;
 int v3;
};


auto pv1 = &SomeClass::v1;
auto pv2 = &SomeClass::v2;
auto pv3 = &SomeClass::v3;

auto t = std::tie(pv1, pv2, pv3);

int main() {

  SomeClass c;
  c.v1 = 111;
  c.v2 = 222;
  c.v3 = 333;

  std::cout << c.*std::get<0>(t) << std::endl << c.*std::get<1>(t) << std::endl << c.*std::get<2>(t) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

但这不编译

#include <iostream>
#include <tuple>

struct SomeClass {
 int v1;
 int v2;
 int v3;
};

auto t = …
Run Code Online (Sandbox Code Playgroud)

c++ templates c++11

2
推荐指数
1
解决办法
626
查看次数

标签 统计

c++ ×4

c++11 ×4

templates ×3