相关疑难解决方法(0)

如何检查模板参数的类型?

假设我有一个模板函数和两个类

class animal {
}
class person {
}

template<class T>
void foo() {
  if (T is animal) {
    kill();
  }
}
Run Code Online (Sandbox Code Playgroud)

我怎么检查T是动物?我不想在运行时检查一些东西.谢谢

c++ templates

71
推荐指数
5
解决办法
8万
查看次数

c ++仿函数和函数模板

考虑这个简单而毫无意义的代码.

#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++ templates functor

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

不同编译器使用的不同铸造操作符

以下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

14
推荐指数
2
解决办法
214
查看次数

转换运算符重载歧义,编译器不同

我已经看到了关于此的其他问题,但没有一个完全解释它.编译器处理以下两种情况的正确方法是什么?我用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)

输出:

  • gcc 4.7.1:好的
  • VS2010:好的
  • VS2012:失败:"无法从BB转换为字符串"

例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)

c++ gcc operators visual-studio

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

c ++ Template []重载

我有一个类,它具有括号运算符的模板函数.它编译但我无法弄清楚如何访问它.

见下面的例子:

   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)

感谢任何帮助,亚当

c++ templates

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