我有以下代码
#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) 具有以下功能
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)
我不需要成为一个函数模板,只需要一些机制来实现相同的功能.
我正在尝试做一个调用另一个类的模板静态方法的模板方法,但是我得到了一些编译错误.最小的情况如下.
如果我编译下面的代码
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,编译传递所以它似乎与函数的模板参数有一些解析问题.像其他情况一样,我认为它需要一些using或typename黑客来使其工作.
我想了解这种行为的原因:
这段代码很完美:
#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)