我是模板新手所以也许这是一件微不足道的事情,但我无法让它发挥作用.我试图获得类成员函数的部分特化.最短的代码是:
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)
将不胜感激任何帮助:-)
以下代码:
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)
然后它正确编译.
我可以想象以下代码:
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
我整个早上都遇到过这个问题而没有任何结果.基本上,我需要一个简单的元编程事物,如果传递的参数是一种std :: vector,我可以分支到不同的特化.
某种类型的is_base_of用于模板.
这样的事情存在吗 ?
我正在尝试编写一个类模板,该模板使用参数包并为参数包中包含的每种类型实现一个成员函数。
这是我到目前为止:
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)成员函数。
我在网上找到了很多关于参数包可用性的例子,但我不知道它是否可以用于我的目的,或者我是否完全误解了参数包的用途。
我以为我需要解包参数包,但在阅读了很多关于解包参数包的示例后,我认为这不是正确的选择,它具有完全不同的含义。
因此,因此,我正在寻找一种“离婚”参数包的操作。