相关疑难解决方法(0)

c ++模板部分特化成员函数

我是模板新手所以也许这是一件微不足道的事情,但我无法让它发挥作用.我试图获得类成员函数的部分特化.最短的代码是:

template <typename T, int nValue> class Object{
private:
    T m_t;
    Object();
public:
    Object(T t): m_t(t) {}
    T Get() { return m_t; } 
    Object& Deform(){ 
        m_t*=nValue; 
        return *this;
    }
};

template <typename T>
Object<T,0>& Object<T,0>::Deform(){
    this->m_t = -1;
    return *this;
}

int main(){
    Object<int,7> nObj(1);
    nObj.Deform();
    std::cout<<nObj.Get();
}
Run Code Online (Sandbox Code Playgroud)

我试过非成员函数,这很好.什么也工作正常是成员函数的完全专业化.

但是,每当我尝试部分规格时.一个成员函数我得到的形式错误:

PartialSpecification_MemberFu.cpp(17): error: template argument
list must match the parameter list Object<T,0>& Object<T,0>::Deform().
Run Code Online (Sandbox Code Playgroud)

将不胜感激任何帮助:-)

c++ templates specialization

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

部分模板特化的"无效使用不完整类型"错误

以下代码:

template <typename S, typename T>
struct foo {
   void bar();
};

template <typename T>
void foo <int, T>::bar() {
}
Run Code Online (Sandbox Code Playgroud)

给了我错误

invalid use of incomplete type 'struct foo<int, T>'
declaration of 'struct foo<int, T>'
Run Code Online (Sandbox Code Playgroud)

(我正在使用gcc.)我的部分特化的语法错了吗?请注意,如果我删除第二个参数:

template <typename S>
struct foo {
   void bar();
};

template <>
void foo <int>::bar() {
}
Run Code Online (Sandbox Code Playgroud)

然后它正确编译.

c++ gcc templates partial-specialization

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

在编译时检查是模板类型向量

我可以想象以下代码:

template <typename T> class X
{
  public:
   T container;

   void foo()
   {
      if(is_vector(T))
         container.push_back(Z);
      else
         container.insert(Z);
   }
}

// somewhere else...

X<std::vector<sth>> abc;
abc.foo();
Run Code Online (Sandbox Code Playgroud)

如何编写,成功编译?我知道类型特征,但是当我定义时:

template<typename T> struct is_vector : public std::false_type {};

template<typename T, typename A>
struct is_vector<std::vector<T, A>> : public std::true_type {};
Run Code Online (Sandbox Code Playgroud)

它不编译:

error: no matching function for call to 'std::vector<sth>::insert(Z)'
Run Code Online (Sandbox Code Playgroud)

static_assert也不是我想要的.有什么建议吗?

这是我想要实现的一个简短例子(SSCCE):http://ideone.com/D3vBph

c++ templates

19
推荐指数
3
解决办法
3842
查看次数

如何知道某个类型是否是std :: vector的特化?

我整个早上都遇到过这个问题而没有任何结果.基本上,我需要一个简单的元编程事物,如果传递的参数是一种std :: vector,我可以分支到不同的特化.

某种类型的is_base_of用于模板.

这样的事情存在吗 ?

c++ metaprogramming

16
推荐指数
3
解决办法
4630
查看次数

分离类模板中的参数包

我正在尝试编写一个类模板,该模板使用参数包并为参数包中包含的每种类型实现一个成员函数。

这是我到目前为止:

template <typename...T>
class Myclass {
public:
    void doSomething((Some_Operator_to_divorce?) T) {
        /*
         * Do Something
         */
        std::cout << "I did something" << std::endl;
    }
};
Run Code Online (Sandbox Code Playgroud)

我的目标是拥有一个可以按以下方式使用的类模板:

Myclass<std::string, int, double> M;

M.doSomething("I am a String");
M.doSomething(1234);
M.doSomething(0.1234);
Run Code Online (Sandbox Code Playgroud)

凡类模板机制将创建一个实现doSomething(std::string x),一个doSomething(int x)和doSomething(double x)成员函数而不是一个doSomething(std::string x, int i, double f)成员函数。

我在网上找到了很多关于参数包可用性的例子,但我不知道它是否可以用于我的目的,或者我是否完全误解了参数包的用途。

我以为我需要解包参数包,但在阅读了很多关于解包参数包的示例后,我认为这不是正确的选择,它具有完全不同的含义。

因此,因此,我正在寻找一种“离婚”参数包的操作。

c++ templates class variadic parameter-pack

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