假设我有一个模板函数和两个类
class animal {
}
class person {
}
template<class T>
void foo() {
if (T is animal) {
kill();
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么检查T是动物?我不想在运行时检查一些东西.谢谢
考虑这个简单而毫无意义的代码.
#include <iostream>
struct A {
template<int N>
void test() {
std::cout << N << std::endl;
}
};
int main() {
A a;
a.test<1>();
}
Run Code Online (Sandbox Code Playgroud)
这是一个非常简单的函数模板示例.但是,如果我想A::test
用重载代替operator()
它以使它成为一个算符呢?
#include <iostream>
struct A {
template<int N>
void operator()() {
std::cout << N << std::endl;
}
};
int main() {
A a;
a<1>(); // <-- error, how do I do this?
}
Run Code Online (Sandbox Code Playgroud)
当然,如果采用operator()
依赖于模板的参数,编译器可能会推导出模板.但我无法弄清楚使用无参数仿函数指定模板参数的正确语法.
有没有正确的方法来做到这一点?
显然,这个代码可以工作,因为它绕过了仿函数语法:
a.operator()<1>();
Run Code Online (Sandbox Code Playgroud)
但这有点打败了它作为仿函数的目的:-P.
以下C++程序在我尝试的所有编译器中编译时都没有警告(gcc 4.6.3,llvm 3.0,icc 13.1.1,SolarisStudio 12.1/12.3):
struct CClass
{
template<class T>
operator T() const { return 1; }
operator int() const { return 2; }
};
int main(void)
{
CClass x;
return static_cast<char>(x);
}
Run Code Online (Sandbox Code Playgroud)
但是,除SolarisStudio编译器之外的所有编译器都返回2,SolarisStudio(任一版本)返回1,我认为这是最合乎逻辑的结果.
return x.operator char();
在所有编译器中使用结果返回1.
显然,自从搞清楚后,我一直在使用后者的表示法.但是,我想知道哪些编译器是正确的以及为什么.(人们会认为大多数都是规则,但这仍然无法解释原因.)
这个问题似乎与这里,这里和这里的SO问题有关,但这些"仅"给出问题的解决方案,没有解释(我能够适用于我的特定问题).
请注意,添加一个额外的重载转换运算符,比如说operator float() const { return 3; }
除了SolarisStudio之外的所有编译器都会抱怨模糊性.
c++ templates casting operator-overloading overload-resolution
我已经看到了关于此的其他问题,但没有一个完全解释它.编译器处理以下两种情况的正确方法是什么?我用gcc 4.7.1(使用-std = c ++ 0x),VS2010和VS2012尝试了一下,得到了不同的结果:
例1:
struct BB
{
// generic cast
template<typename T>
operator T() const
{
return 0;
}
// string cast
operator std::string() const
{
return string("hello");
}
};
int main()
{
BB b;
string s = b;
}
Run Code Online (Sandbox Code Playgroud)
输出:
例2:
struct BB
{
// generic cast
template<typename T>
operator T() const
{
return 0;
}
// string cast
operator std::string() const
{
return string("hello");
}
};
int main()
{ …
Run Code Online (Sandbox Code Playgroud) 我有一个类,它具有括号运算符的模板函数.它编译但我无法弄清楚如何访问它.
见下面的例子:
class Test {
public:
template <class T> pServiceState operator[] (const std::string project) {
return getService<T>(project);
}
template <class T> pServiceState getService(const std::string project) {
pService s = get_service<T>();
if(s == NULL) throw "Service does not exist on server";
return s->state(project);
}
}
int main(){
states.getService<content_uploader>("asd"); // Works
states<content_uploader>["asd"]; // Throws syntax errors.
/*
error: expected primary-expression before ‘>’ token
error: expected primary-expression before ‘[’ token
*/
}
Run Code Online (Sandbox Code Playgroud)
感谢任何帮助,亚当